blabap
Messages postés8Date d'inscriptionvendredi 17 août 2007StatutMembreDernière intervention18 juillet 2008
-
17 juil. 2008 à 20:27
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 2009
-
20 juil. 2008 à 01:50
Bonjour a toutes et a tous,
je suis en train de développer une application me permettant d'avoir une base de données de mes musiques qui me permettra de faireune recherche plus rapide qu'avec Windows.
Le soucis est que j'ai plus de 3000 MP3.
Donc lors de mon traitement, j'ai mon application qui Fige.
J'ai donc pour cela essayé d'implémenter un backgroundWorker, pour réaliser mon traitement, et afficher la progresion sur une progressBar.
Mais je n'arrive pas a implémenter et faire fonctionner complètement ce backgroudworker, malgré mes recherches et mes tentatives d'adaptation des exemples trouvés.
Pour aller chercher mes fichiers, j'utilise un folderBrowserDialog.
Voila je pense vous avoir donné toutes les informations possibles.
Merci d'avance pour votre aide future.
Balabap
PS : une fois terminé ce programme et ses sources seront publiés.
blabap
Messages postés8Date d'inscriptionvendredi 17 août 2007StatutMembreDernière intervention18 juillet 2008 17 juil. 2008 à 22:33
Ok merci je vais regarder demain, si je trouve mon bonheur parmis ces infos, mais je vois pas ou peut intervenir un sleep ou un timer dans un backgroundWorker.
blabap
Messages postés8Date d'inscriptionvendredi 17 août 2007StatutMembreDernière intervention18 juillet 2008 18 juil. 2008 à 17:11
Tu voudrais donc parcourir tes fichiers mp3 sur le disque et en créer une base de donnée access?
Oui c'est tout a fait ça et récupérer les ID3 tags (mais tout cela je sait faire)
C'est quoi qui prend du temps dans ton processus? Ce qui prend du temps c'est justement le parcours du dossier et ses sous dossiers sélectionné avec le FolderBrowser et l'inscription de chacun des MP3 dans ma base de données, ainsi que les informations que je récupère dans le tag ID3.
et a la fin de ce traitement me met a jour mon DataGRidView avec les données de ma base.
Ais-je été assez clair?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 18 juil. 2008 à 18:48
Effectivement, c'est très clair mtn
Si je t'ai demandé ce qui prenait du temps, c'est parce que je doute que tu puisse ajouter des items à ta base de données depuis un Thread différent sans faire de spécialités (communications inter-thread).
Donc, le mieux je pense est de parcourir tes fichiers et des lire les tag ID3 dans le 2ème thread, puis de renvoyer les résultats au thread principal qui les ajoutera à ta base de donné.
1. Donc dans DoWork du BackgroundWorker tu parcours les fichiers et tu lis les tag ID3.
2. Tu sauves le résultats dans une classe ou une structure que tu aura préalablement créé.
3a. Après tu as le choix entre renvoyer le résultats avec ReportProgress, ce qui permet d'ajouter les nouveaux fichiers dans la BDD au fur et à mesure qu'ils sont chargé,
3b. ou alors tu renvois une liste de résultats à la fin du traitement de tous tes fichiers, puis tu les ajoutes tous à ta BDD en une seule fois (ce qui risque de figer l'appli un petit coup aussi).
4. Pour la barre de progression, ça se fait aussi avec ReportProgress.
title = TagID3.Substring(3, 30).Trim.Replace(Chr(0),
""
).Trim(
CChar
(vbNullChar))
'Initialisation de Author
artist = TagID3.Substring(33, 30).Trim.Trim.Replace(Chr(0),
""
).Trim(
CChar
(vbNullChar))
'Initialisation de Album
album = TagID3.Substring(63, 30).Trim.Trim.Replace(Chr(0),
""
).Trim(
CChar
(vbNullChar))
End
If
StreamReadWrite.Close()
ObjetDataRow = MusikotechDataSet.Tables(
"MP3"
).NewRow()ObjetDataRow(
"Artiste"
) = artistObjetDataRow(
"Titre"
) = titleObjetDataRow(
"Album"
) = albumObjetDataRow(
"Chemin"
) = Path2ObjetDataRow(
"nomfichier"
) = NameMusikotechDataSet.Tables(
"MP3"
).Rows.Add(ObjetDataRow)
'Validation des changements
Me
.MP3BindingSource.EndEdit()
' On met a jour les changements
Me
.MP3TableAdapter.Update(
Me
.MusikotechDataSet.MP3)
Next
End
If
' On recharge la table dans le datagridview
Dim
matable
As
New
DataTablematable = MusikotechDataSet.Tables(
"MP3"
)MP3DataGridView.DataSource = matable
MP3DataGridView.AutoResizeColumns()
MP3BindingSource.Sort =
"Artiste ASC"
Label2.Text = MusikotechDataSet.Tables(
"MP3"
).Rows.Count()
Voila mon traitement.
Donc ce traitement est dans un Sub qui s'appel Traitement.
Sans BackgroundWorker je clic sur un bouton qui lui lance ce traitement.
avec BackgroundWorker j'ai fait la même chose mais dans le doWork, et la le folderBrowserDialog ne s'affiche pas.
Donc j'ai enlevé l'appel du folderbrowserdialog dans le do work et je l'ai mis dans le code de mon bouton, et la il fonctionne, mais je n'ai toujours pas de remplissage de mon datagridview.
Et la j'ai fait un débogage pas a pas, et dans le dowork, il réalise une instruction et pas plus, il veut pas réaliser plus d'isntructions.
Si ça peut t'aider un petit a m'éclaircir sur les secrets du backgroudnWorker? surtout avec le passage de paramêtres au backgroundworker
Merci
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 20 juil. 2008 à 01:50
"Et la j'ai fait un débogage pas a pas, et dans le dowork, il réalise une instruction et pas plus, il veut pas réaliser plus d'isntructions."
C'est normal si la 1ère ligne du DoWork est :
Dim files() As String = System.IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath, "*.mp3", SearchOption.AllDirectories)
FolderBrowserDialog1.SelectedPath n'est pas accessible dans ce contexte.
Le seul secret d'un BackgroundWorker c'est qu'il faut faire attention aux accès inter-thread. Pour le passage des paramètres, regarde les arguments de RunWorkerAsync, ReportProgress et e dans le DoWork.
Mais je me suis amusé à faire un lecteur de tags basé sur ton code. Le voici (suffit de faire un copier-coller dans un fichier .vb dans un projet) :
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub btnFolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFolder.Click
Dim dlg As New FolderBrowserDialog
dlg.RootFolder = Environment.SpecialFolder.MyMusic
If dlg.ShowDialog = Windows.Forms.DialogResult.OK Then
If Loader IsNot Nothing AndAlso Loader.IsBusy Then Loader.CancelAsync()
Loader = New System.ComponentModel.BackgroundWorker
Loader.WorkerReportsProgress = True
Loader.WorkerSupportsCancellation = True
lstMP3.Items.Clear()
prgBar.Value = 0
prgBar.Visible = True
txtFolder.Text = dlg.SelectedPath
Loader.RunWorkerAsync(dlg.SelectedPath)
End If
End Sub
Private WithEvents Loader As System.ComponentModel.BackgroundWorker
Private Sub Loader_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Loader.DoWork
Dim worker As System.ComponentModel.BackgroundWorker = sender
Dim files() As String = System.IO.Directory.GetFiles(e.Argument, "*.mp3", IO.SearchOption.AllDirectories)
Dim cnt As Integer = files.Length
For i As Integer = 0 To cnt - 1
If worker.CancellationPending Then Exit For
Dim file As String = files(i)
Dim mp3 As New MP3(file)
worker.ReportProgress((i + 1) / cnt, mp3)
Next
End Sub
Private Sub Loader_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles Loader.ProgressChanged
If sender Is Loader Then
prgBar.Value = e.ProgressPercentage
Dim mp3 As MP3 = e.UserState
Dim item As New ListViewItem(mp3.Title)
item.SubItems.Add(mp3.Artist)
item.SubItems.Add(mp3.Album)
item.SubItems.Add(mp3.FileName)
item.SubItems.Add(mp3.Directory)
lstMP3.Items.Add(item)
End If
End Sub
Private Sub Loader_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Loader.RunWorkerCompleted
If sender Is Loader Then
prgBar.Visible = False
End If
End Sub
#Region " Designer "
' Code généré par le designer, on touche pas
'Form remplace la méthode Dispose pour nettoyer la liste des composants.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Requise par le Concepteur Windows Form
Private components As System.ComponentModel.IContainer
'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
'Elle peut être modifiée à l'aide du Concepteur Windows Form.
'Ne la modifiez pas à l'aide de l'éditeur de code.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.txtFolder = New System.Windows.Forms.TextBox
Me.btnFolder = New System.Windows.Forms.Button
Me.lstMP3 = New System.Windows.Forms.ListView
Me.prgBar = New System.Windows.Forms.ProgressBar
Me.Label1 = New System.Windows.Forms.Label
Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader3 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader4 = New System.Windows.Forms.ColumnHeader
Me.ColumnHeader5 = New System.Windows.Forms.ColumnHeader
Me.SuspendLayout()
'
'txtFolder
'
Me.txtFolder.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.txtFolder.Location = New System.Drawing.Point(12, 12)
Me.txtFolder.Name = "txtFolder"
Me.txtFolder.ReadOnly = True
Me.txtFolder.Size = New System.Drawing.Size(408, 20)
Me.txtFolder.TabIndex = 0
'
'btnFolder
'
Me.btnFolder.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.btnFolder.Location = New System.Drawing.Point(426, 12)
Me.btnFolder.Name = "btnFolder"
Me.btnFolder.Size = New System.Drawing.Size(25, 20)
Me.btnFolder.TabIndex = 1
Me.btnFolder.Text = "..."
Me.btnFolder.UseVisualStyleBackColor = True
'
'lstMP3
'
Me.lstMP3.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
Me.lstMP3.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader3, Me.ColumnHeader2, Me.ColumnHeader4, Me.ColumnHeader5})
Me.lstMP3.Location = New System.Drawing.Point(12, 58)
Me.lstMP3.Name = "lstMP3"
Me.lstMP3.Size = New System.Drawing.Size(439, 347)
Me.lstMP3.TabIndex = 2
Me.lstMP3.UseCompatibleStateImageBehavior = False
Me.lstMP3.View = System.Windows.Forms.View.Details
'
'prgBar
'
Me.prgBar.Location = New System.Drawing.Point(204, 38)
Me.prgBar.Name = "prgBar"
Me.prgBar.Size = New System.Drawing.Size(247, 14)
Me.prgBar.TabIndex = 3
Me.prgBar.Visible = False
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(12, 39)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(98, 13)
Me.Label1.TabIndex = 4
Me.Label1.Text = "MP3 de ce dossier:"
'
'ColumnHeader1
'
Me.ColumnHeader1.Text = "Titre"
Me.ColumnHeader1.Width = 99
'
'ColumnHeader2
'
Me.ColumnHeader2.Text = "Album"
Me.ColumnHeader2.Width = 96
'
'ColumnHeader3
'
Me.ColumnHeader3.Text = "Artiste"
Me.ColumnHeader3.Width = 96
'
'ColumnHeader4
'
Me.ColumnHeader4.Text = "Fichier"
Me.ColumnHeader4.Width = 141
'
'ColumnHeader5
'
Me.ColumnHeader5.Text = "Dossier"
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(463, 417)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.prgBar)
Me.Controls.Add(Me.lstMP3)
Me.Controls.Add(Me.btnFolder)
Me.Controls.Add(Me.txtFolder)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents txtFolder As System.Windows.Forms.TextBox
Friend WithEvents btnFolder As System.Windows.Forms.Button
Friend WithEvents lstMP3 As System.Windows.Forms.ListView
Friend WithEvents prgBar As System.Windows.Forms.ProgressBar
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader3 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader4 As System.Windows.Forms.ColumnHeader
Friend WithEvents ColumnHeader5 As System.Windows.Forms.ColumnHeader
#End Region
End Class
Public Structure MP3
Private _File As String
Private _Title As String
Private _Album As String
Private _Artist As String
Private _TagsPresent As Boolean
Public Sub New(ByVal File As String)
If IO.File.Exists(File) Then
Try
_File = File
Dim S As New System.IO.FileStream(File, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite)
Dim buffer(128) As Byte
S.Seek(-128, System.IO.SeekOrigin.End)
S.Read(buffer, 0, 128)
Dim Encodeur As New System.Text.UTF7Encoding
Dim tag As String = Encodeur.GetString(buffer)
If tag.Substring(0, 3).Equals("TAG") Then
_TagsPresent = True
_Title = tag.Substring(3, 30).Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
_Artist = tag.Substring(33, 30).Trim.Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
_Album = tag.Substring(63, 30).Trim.Trim.Replace(Chr(0), "").Trim(CChar(vbNullChar))
Else
_TagsPresent = False
End If
S.Close()
Catch ex As Exception
Throw New Exception("Impossible de lire ce fichier", ex)
End Try
Else
Throw New IO.FileNotFoundException
End If
End Sub
Public ReadOnly Property TagsPresent() As Boolean
Get
Return _TagsPresent
End Get
End Property
Public ReadOnly Property FullPath() As String
Get
Return _File
End Get
End Property
Public ReadOnly Property DirectoryName() As String
Get
Return IO.Path.GetFileName(IO.Path.GetDirectoryName(_File))
End Get
End Property
Public ReadOnly Property Directory() As String
Get
Return IO.Path.GetDirectoryName(_File)
End Get
End Property
Public ReadOnly Property FileName() As String
Get
Return IO.Path.GetFileName(_File)
End Get
End Property
Public ReadOnly Property FileWithoutExtension()
Get
Return IO.Path.GetFileNameWithoutExtension(_File)
End Get
End Property
Public ReadOnly Property Title() As String
Get
Return _Title
End Get
End Property
Public ReadOnly Property Album() As String
Get
Return _Album
End Get
End Property
Public ReadOnly Property Artist() As String
Get
Return _Artist
End Get
End Property
Public Overrides Function ToString() As String
Return _Artist & " - " & _Album & " - " & _Title & " (" & FileName & ")"
End Function