BackgroundWorker et Base de données Access

blabap Messages postés 8 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 18 juillet 2008 - 17 juil. 2008 à 20:27
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Derniè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.

7 réponses

zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
17 juil. 2008 à 21:09
regarde:
 - doevents
 - sleep
 - timer

;)

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
0
blabap Messages postés 8 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 18 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.

Balabap
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
17 juil. 2008 à 23:57
Salut,

Non pas besoins de timer ou de sleep en plus de ton BackgroundWorker...
Mais non, tu ne nous en dis pas assez... ou est ton problème?

Tu voudrais donc parcourir tes fichiers mp3 sur le disque et en créer une base de donnée access?
C'est quoi qui prend du temps dans ton processus?
0
blabap Messages postés 8 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 18 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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.

Quels problèmes à tu eu avec le BackgroundWorker?
0
blabap Messages postés 8 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 18 juillet 2008
18 juil. 2008 à 21:11
Si ca peut t'interesser, voici mon code de traitement :


If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then









Dim

files()


As





String

= System.IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath,


"*.mp3"

, SearchOption.AllDirectories)



'--------------- Récupèration de toutes les infos








'' pour récupération des infos en focntion du nom de fichier








Dim

Path


As





String








Dim

Path2


As





String








Dim

Name


As





String








'' Pour récupérer le tag ID3 du MP3








Dim

Encodeur


As





New

System.Text.ASCIIEncoding



Dim

TagID3


As





String








Dim

title


As





String








Dim

artist


As





String








Dim

album


As





String








Dim

Buffer(128)


As





Byte








Dim

StreamReadWrite


As

System.IO.FileStream



Dim

F


As

System.IO.FileInfoButtonVider.Enabled =



False


ButtonAjoutMasse.Enabled =





False








For





Each

foundFile


As





String





In

filesTagID3 =



""


title =





""


artist =





""


album =





""


Path =





""


Path2 =





""


Name =





""


F =





My

.Computer.FileSystem.GetFileInfo(foundFile)Path = F.FullName

Path2 = F.DirectoryName

Name = F.Name



Try


StreamReadWrite =





New

System.IO.FileStream(Path, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite)



Catch

ex


As

Exception



Exit





Sub








End





Try


StreamReadWrite.Seek(-128, System.IO.SeekOrigin.End)


StreamReadWrite.Read(Buffer, 0, 128)


TagID3 = Encodeur.GetString(Buffer)








'Recherche du Tag TAG








If

TagID3.Substring(0, 3).Equals(


"TAG"

)


Then








'Initialisation de Title


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
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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

End Structure
0
Rejoignez-nous