Accueil > Forum > > > > BackgroundWorker et Base de données Access
BackgroundWorker et Base de données Access
jeudi 17 juillet 2008 à 20:27:37 |
BackgroundWorker et Base de données Access

blabap
|
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.
|
|
jeudi 17 juillet 2008 à 21:09:57 |
Re : BackgroundWorker et Base de données Access

zen69
|
regarde: - doevents - sleep - timer ;) zen69 aka Ortho Le Profett [site web]
|
|
jeudi 17 juillet 2008 à 22:33:33 |
Re : BackgroundWorker et Base de données Access

blabap
|
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
|
|
jeudi 17 juillet 2008 à 23:57:56 |
Re : BackgroundWorker et Base de données Access

Kevin.Ory
|
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?
|
|
vendredi 18 juillet 2008 à 17:11:06 |
Re : BackgroundWorker et Base de données Access

blabap
|
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?
|
|
vendredi 18 juillet 2008 à 18:48:37 |
Re : BackgroundWorker et Base de données Access

Kevin.Ory
|
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?
|
|
vendredi 18 juillet 2008 à 21:11:47 |
Re : BackgroundWorker et Base de données Access

blabap
|
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
|
|
dimanche 20 juillet 2008 à 01:50:47 |
Re : BackgroundWorker et Base de données Access

Kevin.Ory
|
"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) :
[size=1]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[/size]
|
|
Cette discussion est classée dans : access, base, application, données, backgroundworker
Répondre à ce message
Livres en rapport
|
Derniers Blogs
[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE[RIA SERVICES] INCLUDE ET DOMAINDATASOURCE par Audrey
Dans un de mes articles précédents , j'avais parlé des DomainDataSource avec RIA Services dans le cas d'une interface Maître - Détail. Dans le même principe, je vais parler d'une autre manière de mettre en forme ce cas d'interface avec RIA Services. Et po...
Cliquez pour lire la suite de l'article par Audrey ZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATIONZUNE : VERSION ZUNE SOFTWARE V 4.2 ET LA SOCIALISATION par ROMELARD Fabrice
Une des nouveautés de la version V 3.0 était l'apparition de l'onglet Social qui ne fonctionnait que si le MarketPlace était activé sur son poste. Cela limitait donc son intérêt, car hors du cadre commercial USA-CANADA, peu de monde trouva...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PRATIQUE DE SILVERLIGHT PAR ERIC AMBROSIPRATIQUE DE SILVERLIGHT PAR ERIC AMBROSI par MPOWARE
Je viens de finir la lecture du dernier livre d'
Eric Ambrosi
éditions PEARSON
Son livre donne une approche pratique de Silverlight qui sera aussi bien comprise par le développeur que par le designeur.
Tous les aspects du développement RIA sont abor...
Cliquez pour lire la suite de l'article par MPOWARE APPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NETAPPRENDRE à DéVELOPPER POUR LES MOBILES AVEC LA NOUVELLE GéNéRATION .NET par odewit
2 déclinaisons de Silverlight et 2 déclinaisons de Mono permettent dorénavant (ou permettront prochainement) de développer des applications .NET mobiles pour les principales plates-formes du marché :
Silverlight pour Symbian, basé sur Silverlight 2...
Cliquez pour lire la suite de l'article par odewit ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2ZUNE : NOUVELLE VERSION DU ZUNE SOFTWARE - V 4.2 par ROMELARD Fabrice
Avec la dernière génération du lecteur MP3 de Microsoft, le ZUNE HD, Microsoft a publié une nouvelle version du logiciel pour PC. Ainsi, je me suis décidé à installer celle-ci sur mon Tablet PC ACER, comme toujours le logiciel est donc tél...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|