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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
VB.NET ET COMBOBOXVB.NET ET COMBOBOX par minouthebreaker
Cliquez pour lire la suite par minouthebreaker
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|