begin process at 2010 03 22 08:09:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Base de données

 > 

Access

 > 

BackgroundWorker et Base de données Access


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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.FileInfo

ButtonVider.Enabled =

False

ButtonAjoutMasse.Enabled =

False

For Each foundFile As String In files

TagID3 =

""

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" ) = artist

ObjetDataRow(

"Titre" ) = title

ObjetDataRow(

"Album" ) = album

ObjetDataRow(

"Chemin" ) = Path2

ObjetDataRow(

"nomfichier" ) = Name

MusikotechDataSet.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 DataTable

matable = 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

Sujets en rapport avec ce message

Base de données ACCESS [ par tenthor ] Bonjour, Je suis étudiant en informatique (DUT). En ce moment je fais mon stage.J'ai une application de gestion à développer avec Microsoft Visual Bas Reconduite d'une application ACCESS en SQL [ par LEBLONPI ] Je dois reconduire une application ACCESS en SQL... Dans un premier temps, je n'ai reconduit que la base de données tout en Application VB6 et base de données ACCESS 2003 [ par Niangoran ] Bonjour chres amisJ ai developpé une application avec VB6 et la base de données est conçue sur ACCESS 2003.la base principale est logée sur un serveur base de données sur access [ par tombeduciel ] bonjourj'ai un probléme dans une application que j'ai crée sur access,c'est une application de gestion de stock,elle était efficace pendant plusieurs Echec de connection à une base de données access [définir un mot de passe ] [ par stitox ] slt tout le monde, je commence on faite j'ai fini mon application (gestion documentaire) crée en vb net 2008 et utilisant access comme base de données Accéder à la base de données Access depuis plusieurs postes [ par ptitelili059 ] Bonjour, Voilà je viens de développer une petite application en VB6 pour l'entreprise dans laquelle je suis en stage. L'application est en relation a application et base de données multiple Access [ par daniel ] Bonjour,merci de lire ce message.J'ai une application un peu particulière dans la mesure où il s'agit de créer et visualiser des bases de données créé au bord du suicide!!!! Comment créer une table dans une base de données à l'aide d'un code VB [ par velocy ] tout d'abord merci à toutes les personnes qui liront ce message!!!j'ai un énorme problème!!j'aimerais savoir comment à partir de VB, créer une base de sauvegarder une base de données Access [ par Crazyturky ] Salut à tous !En fait je suis actuellement sur une application sur vb6 et je souhaiterais dans la mesure du possible pourvoir sauvegarder ma base de d programmation [ par billymalombo ] Bonjour à tous. C'est Billy au congo RD. Mon problème est celui ci: Je suis entrain de concevoir une application sous vb 6.0 qui doit interagir avec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales