IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Encore un problème avec le multithread


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut Encore un problème avec le multithread
    Bonjour,

    En résumer voila mon problème

    j'ai un form mdi container ... dans mon mdi parent je charge mon dataset, dans mon mdienfant je cherche à faire des modifications. Lorsque je travail sans multithread j'ai pas de problème, mais lorsque je passe en multithread je suis incappable de lire le dataset.

    merci de votre soutiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    Sub MAJ(ByVal Str As String)
            Dim Dir2 As New DirectoryInfo(Str)
            Console.WriteLine(Dir2.Name)
     
            Dim Fl() As String = Directory.GetFiles(Dir2.FullName & "\MiseAJour\")
            QuSymb = New Queue
            If Fl.Count > 4000 Then
                For Each itFl As String In Fl
                    Dim FlInfo As New FileInfo(itFl)
                    QuSymb.Enqueue(FlInfo.FullName)
                    'Console.WriteLine(FlInfo.FullName)
                Next
     
    *****Avant de démarrer les thread je lit les infos de mon dataset sans problème *****************
     
                Console.WriteLine(MDIPar._Ds.Tables.Count)
                For Each tb As DataTable In MDIPar._Ds.Tables
                    Console.WriteLine("Ici  " & tb.TableName)
                Next
    *************************************************************
                For i = 0 To NbrThread
                    Dim T As New Threading.Thread(AddressOf DoTheTask2)
                    T.Name = "Threads#" & i.ToString
                    T.Start()
                Next
            End If
            Console.WriteLine(QuSymb.Count.ToString)
            'QuSymb = Nothing
     
     
    Sub DoTheTask2()
    *************ic ça fonctionne plus *********************
            SyncLock MDIPar._Ds
                Console.WriteLine(MDIPar._Ds.Tables.Count)
                For Each tb As DataTable In MDIPar._Ds.Tables
                    Console.WriteLine("Ici  " & tb.TableName)
                Next
            End SyncLock
    ...etc.
        End Sub
    merci et bonne journée

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    ca ne fonctionne plus = ?

    pourquoi un synclock ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    merci pour ton aide,

    Ce que je veux dire avant de démarrer les threads je fais une boucle pour connaitre le nom des tables du dataset (Pour vérifier que je peut manipuler mes tables). à l'intérieur des threads je compte 0 tables dans mon dataset.

    Le syncLock c'est que j'essai des tentatives.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    où est déclaré NbrThread (enfin que vaut il ? parce que s'il vaut 0 aucun thread ne va démarrer, d'ailleurs tu as mis un point d'arret dans la sub du thread pour voir ?)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    présentement j'utilise deux threads

    puis ils démarrent car ma queue dequeue lol mais le MDIPar._Ds.Tables.Count reste à 0

    pour plus d'information voila comment j'ai organiser mon code

    Dans mon MDIparent je charge mon dataset
    P.S. ça semble bien fonctionner, si il y a erreur merci de m'informer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
     Public _Ds As New DataSet
     
    Sub ChargementDataSet(ByVal item As String)
            Dim Da As OleDbDataAdapter
            Select Case item
                Case "Tous"
                    _Ds.Clear()
                    Da = New OleDbDataAdapter("SELECT TblSymb.Id_Symb,TblSymb.Symbole, TblSymb.Market, TblSymb.[Actif] FROM TblSymb WHERE (((TblSymb.[Actif])=True));", My.Settings.DbConn)
                    da.Fill(_Ds, "TblSymbole")
                    Da = Nothing
                    With _Ds.Tables("TblSymbole").Columns("Id_Symb")
                        .Unique = True
                        .AllowDBNull = False
                        .ReadOnly = True
                        .AutoIncrement = True
                        .AutoIncrementSeed = 1
                        .AutoIncrementStep = 1
                    End With
                    da = New OleDbDataAdapter("SELECT TblCompagnie.* FROM TblCompagnie;", My.Settings.DbConn)
                    da.Fill(_Ds, "TblCompagnie")
                    Da = Nothing
                    With _Ds.Tables("TblCompagnie").Columns("Id_Comp")
                        .Unique = True
                        .AllowDBNull = False
                        .ReadOnly = True
                        .AutoIncrement = True
                        .AutoIncrementSeed = 1
                        .AutoIncrementStep = 1
                    End With
                    Dim DcClePrimComp As DataColumn = _Ds.Tables("TblCompagnie").Columns("Id_Comp")
     
                    da = New OleDbDataAdapter("SELECT JctSymbComp.IdSymb, JctSymbComp.IdComp FROM JctSymbComp;", My.Settings.DbConn)
                    da.Fill(_Ds, "JctSymbComp")
                    Da = Nothing
                    Try
                        With _Ds.Tables("JctSymbComp").Columns("IdSymb")
                            '.Unique = True
                            '.AllowDBNull = False
                            '.ReadOnly = True
                        End With
                        With _Ds.Tables("JctSymbComp").Columns("IdComp")
                            '.Unique = True
                            .AllowDBNull = False
                            '.ReadOnly = True
                        End With
                    Catch ex As Exception
                        Console.WriteLine(ex.ToString)
                        Console.WriteLine()
                    End Try
                    da = New OleDbDataAdapter("SELECT TblIndice.* FROM TblIndice;", My.Settings.DbConn)
                    da.Fill(_Ds, "TblIndice")
                    da = Nothing
                    'da = New OleDbDataAdapter("SELECT TblDonner.* FROM TblDonner;", My.Settings.DbConn)
                    'da.Fill(_Ds, "TblDonner")
                    'Da = Nothing
                    Da = New OleDbDataAdapter("SELECT TblNews.* FROM TblNews;", My.Settings.DbConn)
                    Da.Fill(_Ds, "TblNews")
                    Da = Nothing
                    Da = New OleDbDataAdapter("SELECT TblDonnerV2.* FROM TblDonnerV2;", My.Settings.DbConn)
                    Da.Fill(_Ds, "TblDonnerV2")
                    Da = Nothing
                    With _Ds.Tables("TblDonnerV2").Columns("IdAutoDonner")
                        .Unique = True
                        .AllowDBNull = False
                        .ReadOnly = True
                        .AutoIncrement = True
                        .AutoIncrementSeed = 1
                        .AutoIncrementStep = 1
                    End With
                    Try
                        Dim DcClePrim As DataColumn = _Ds.Tables("TblSymbole").Columns("Id_Symb")
                        Dim DcCleExt As DataColumn = _Ds.Tables("JctSymbComp").Columns("IdSymb")
                        Dim Dr As New DataRelation("SymbJonc", DcCleExt, DcClePrim)
                        _Ds.Relations.Add(Dr)
     
                        DcClePrim = _Ds.Tables("TblCompagnie").Columns("Id_Comp")
                        DcCleExt = _Ds.Tables("JctSymbComp").Columns("IdComp")
                        Dr = New DataRelation("CompJonc", DcClePrim, DcCleExt)
                        _Ds.Relations.Add(Dr)
                    Catch ex As Exception
                        Console.WriteLine(ex.ToString)
                        Console.WriteLine()
                    End Try
     
     
                Case "DonnerV2"
                    _Ds.Tables("TblDonnerV2").Clear()
                    Da = New OleDbDataAdapter("SELECT TblDonnerV2.* FROM TblDonnerV2;", My.Settings.DbConn)
                    Da.Fill(_Ds, "TblDonnerV2")
                    Da = Nothing
                    With _Ds.Tables("TblDonnerV2").Columns("IdAutoDonner")
                        .Unique = True
                        .AllowDBNull = False
                        .ReadOnly = True
                        .AutoIncrement = True
                        .AutoIncrementSeed = 1
                        .AutoIncrementStep = 1
                    End With
     
            End Select
     
     
     
     
        End Sub
    Maintenant dans une fenêtre enfant, habituellement en monothread (si je peut dire) Je manipule mes tables sans difficulté.
    voila que dans ma tentative de créer plusieurs threads, pour accélérer le traitement, je rencontre des problèmes d'identification de mon dataset

    dans ma fenêtre enfant je code ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    'Ici je liste le nombre de jours que j'ai d'accumuler
    Dim QuNouvJour As New Queue
    'Ici je liste les symboles que je renouvelle à chaque jours 
        Dim QuSymb As New Queue
        Dim NbrThread As Integer = 2
        Dim NbrThFini As Integer = 0
     
    Private Sub MAJ2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
     
                            Dim SousDir() As String = Directory.GetDirectories("***************ActionV2\Archivage\")
     
            For Each itm As String In SousDir
                Dim Dir As New DirectoryInfo(itm)
                Console.WriteLine(Dir.Name)
                QuNouvJour.Enqueue(Dir.FullName)
            Next
            'Voir page 906
            M = New Class1
            M.Texte = QuNouvJour.Dequeue.ToString
            'Console.WriteLine(M.Texte)
            End Sub
     
    Private Sub M_TexteChange(ByVal v As String) Handles M.TextChange
     
            MAJ(M.Texte)
     
            Console.WriteLine(M.Texte)
            'MsgBox("le texte a changé " & M.Texte)
            'M.Texte = QuNouvJour.Dequeue.ToString
        End Sub
     
    Sub MAJ(ByVal Str As String)
            'Ce sont les dossiers ou sont mes fichiers à lire
            Dim Dir2 As New DirectoryInfo(Str)
            Console.WriteLine(Dir2.Name)
            Dim Fl() As String = Directory.GetFiles(Dir2.FullName & "\MiseAJour\")
            QuSymb = New Queue
            If Fl.Count > 4000 Then
                For Each itFl As String In Fl
                    Dim FlInfo As New FileInfo(itFl)
                    'Je prépare une liste de tous mes chemins de fichier
                    QuSymb.Enqueue(FlInfo.FullName)
                    'Console.WriteLine(FlInfo.FullName)
                Next
                'Je test mon dataset et j'obtiens la liste des tables
                Console.WriteLine(MDIPar._Ds.Tables.Count)
                For Each tb As DataTable In MDIPar._Ds.Tables
                    Console.WriteLine("Ici  " & tb.TableName)
                Next
                For i = 0 To NbrThread
                    Dim T As New Threading.Thread(AddressOf DoTheTask2)
                    T.Name = "Threads#" & i.ToString
                    T.Start()
                Next
            End If
            Console.WriteLine(QuSymb.Count.ToString)
               End Sub
    Ici ce sont les action de chaque thread
    Sub DoTheTask2()
            SyncLock MDIPar._Ds.Tables
                Console.WriteLine(MDIPar._Ds.Tables.Count)
                For Each tb As DataTable In MDIPar._Ds.Tables
                    Console.WriteLine("Ici  " & tb.TableName.Count)
                Next
            End SyncLock
     
            Do Until QuSymb.Count = 0
     
                Dim ChemFl As String = String.Empty
                SyncLock QuSymb
                    ChemFl = QuSymb.Dequeue.ToString
                End SyncLock
     
                Dim FlInfo As New FileInfo(ChemFl)
                Dim Strtmp As String = FlInfo.Name
                Dim Ext As String = FlInfo.Extension
                Strtmp = Strtmp.Replace(Ext, "")
                Dim Strtmp2() As String = Strtmp.Split("_"c)
                Dim Symb As String = Strtmp2(0).Split("-"c)(0)
                Dim idSymb As String = Strtmp2(0).Split("-"c)(1)
                Dim Valid As Boolean = False
                Dim SymbBD As String = String.Format("{0}-{1}", Symb, idSymb)
                Dim Cote As String = File.ReadAllText(ChemFl)
     
                If Cote.Contains("qm-last-date") Then
                    Dim Don As New Donner
                    FrmMAJourSymb.RecupDonner(Cote, Symb, Don)
                    Don.Symb = SymbBD
                    If Not Don.Prix = 0 Then
                        Console.WriteLine(Symb)
     
    etc...
                    End If
                End If
            Loop
     
    'Secteur qui s'occupe de démarrer une nouvelle journées à la fin de la séquence
    NbrThFini += 1
            If NbrThFini = NbrThread Then
                           Console.WriteLine("")
                NbrThFini = 0
                SyncLock MDIPar
    'Je fais ici une mise à jours de ma bd innutile de présenter car je me rend pas la 
                    MDIPar.MAJBDDonnerV2()
                End SyncLock
     
                M.Texte = QuNouvJour.Dequeue.ToString
            End If
        End Sub

    J'espère que c'est pas trop le foutoire mon code

Discussions similaires

  1. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  2. Urgent : Encore un problème avec un DbDataReader
    Par Nadiya dans le forum Windows Forms
    Réponses: 6
    Dernier message: 11/06/2007, 09h03
  3. Encore un problème avec Scyte et gets
    Par alixbasix dans le forum Ruby
    Réponses: 10
    Dernier message: 02/03/2007, 15h25
  4. Réponses: 6
    Dernier message: 22/01/2007, 11h43
  5. Encore un problème avec netscape !!
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 06/02/2006, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo