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 :

Multithread et dataset


Sujet :

VB.NET

  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 Multithread et dataset
    Bonjour,

    J'essai de faire un operation multithreads pour accelerer mes opérations dans un environnement non bloquante.

    Lors de l'ouverture du formulaire je créer un dataset avec une table "Echantillon", ensuite je démarre plusieurs thread qui me permettent d'analyser mon échantillon.

    Le code aurait besoin d'amélioration et j'apprécierais vos suggestions

    car j'ai plusieurs messages d'erreurs qui se manifestent ici et la

    il y a en autre
    La collection a été modifiée*; l'opération d'énumération peut ne pas s'exécuter.

    La référence d'objet n'est pas définie à une instance d'un objet.

    DataTable appartient déjà à ce DataSet.

    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
    Private Sub DemarrerToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DemarrerToolStripMenuItem.Click
            For i = 0 To 5
                Dim T As New Threading.Thread(AddressOf DoTheTask)
                T.Name = "Threads#" & i.ToString
                T.Start()
            Next
        End Sub
    Sub DoTheTask()
            'boucle pour modifier les critères d'analyses 
            Do Until QuSymbole.Count = 0
                Dim Symb As String = QuSymbole.Dequeue
                Dim Expression As String = "Symbole='" & Symb & "'"
                Dim FoundRow() As DataRow
                FoundRow = ODTEchantillon.Select(Expression)
                ODTDonnee = New DataTable("" & Symb & "")
                'Importation des lignes de l'expresssion
                For Each r As DataRow In FoundRow
                    Try
                        If Not IsDBNull(r) Then
                            ODTDonnee.ImportRow(r)
                        End If
                    Catch ex As Exception
                        'Si erreur ajoute à la queue le symb non executé
                        Console.WriteLine(Symb & " Message erreur " & ex.Message)
                        QuSymbole.Enqueue(Symb)
                    End Try
                Next
                ObjDataSet.Tables.Add(ODTDonnee)
                Console.WriteLine(ObjDataSet.Tables.Count.ToString)
                Console.WriteLine("Le thread {0} execute le symbole {1} dans le datatable {2} avec {3} données dedans", Thread.CurrentThread.Name, Symb, ODTDonnee.TableName, ODTDonnee.Rows.Count.ToString)
                ODTDonnee.Clear()
                ODTDonnee = Nothing
            Loop
            Console.WriteLine(ObjDataSet.Tables.Count.ToString)
        End Sub
    merci de votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    le multithreading n'est pas quelque chose de forcément simple
    étant que plusieurs thread peuvent accéder aux même choses en même temps ca peut causer des problèmes

    le plus simple c'est i = i + 1
    i est évalué, on ajoute un au résultat, et on range le résultat dans i
    si 2 threads font ca exactement au même moment et que i vaut 2 avant le traitement, on devrait avoir 4 dans i
    or si les 2 lisent 2 au même moment, font +1 ils vont obtenie 3 et ranger 3 dans i

    autre problème rencontré souvent
    un thread qui parcourt une collection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for each item in collection
    next
    et un autre thread qui ajoute ou supprime un élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    collection.add(newitem)
    et le thread qui parcourait la boucle est planté, car la collection a changé et l'énumérateur est caduque


    pour éviter ces cas, il y a diverses méthodes, clone une collection, utiliser synclock, readerwriterlock ou autre
    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
    mon principal problème est que j'ai un message genre objet référence null à la ligne ODTdonnees.clear()

    serait-ce une bonne idée de créer, supposons pour 10 thread, 10 dataset ex:
    Dim ODTDonnees1 as new datatable
    Dim ODTDonnees2 as new datatable
    Dim ODTDonnees3 as new datatable
    etc.

    puis faire l'appel à la datatable au numéro qui correspond au thread appelant

    ex:

    selectcase thread.name

    case thread1
    ODTDonnees1....
    etc.

    ainsi le même thread appelerait toujours le même datatable

    je soumais l'idée...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    oui mais ne pasfaire ca avec un numéro et une variable par thread mais avec un dictionary(of thread, datatable)
    et un truc du genre dt = dico(threading.thread.current)
    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
    En suivant les conseils de Pol63, et utilisant la classe dictionary pour la première fois, j'ai codé ça et j'aimerais votre opinion sur ce, car dans cet état le programme ne roule pas mieux. Cela dit, je suis sur que le conseil de Pol était bon, c'est mon manque d'expérience qui fait défaut.

    Alors j'ai créer un petit programme pour tester le dictionary et j'ai un message d'erreur
    La référence d'objet n'est pas définie à une instance d'un objet.
    à la ligne Console.WriteLine(tf.TableName)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub DoTheTask()
            Dim Sq As New dictio
            Dim Th As String = Thread.CurrentThread.Name
            Sq.Create(Th, "Datata" & Th)
            Ds.Tables.Add(Sq(Th))
            For Each tf As DataTable In Ds.Tables
                Console.WriteLine(tf.TableName)
            Next
            Sq("Datata" & Th) = Nothing
        End Sub
    et la class dictio est

    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
    Public Class dictio
        Inherits System.Collections.DictionaryBase
        Sub Add(ByVal Key As String, ByVal Str1 As DataTable)
            Dictionary.Add(Key, Str1)
        End Sub
        Function Create(ByVal Key As String, ByVal DataT As String) As DataTable
            Create = New DataTable(DataT)
            Dictionary.Add(Key, Create)
        End Function
        Default Property Item(ByVal Key As String) As DataTable
            Get
                Return CType(Dictionary.Item(Key), DataTable)
            End Get
            Set(ByVal value As DataTable)
                Dictionary.Item(Key) = value
            End Set
        End Property
    End Class
    merci de m'aider

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    !?

    pourquoi recréer une classe héritante ?


    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
     
    private _dico as new collections.generic.dictionary(of threading.thread, datatable)
     
    public sub demarrethreads
      for i as integer = 0 to 3
        dim dt as new datatable
        dim th as new threading.thread(addressof threadtraitement)
        _dico.add(th, dt)
      next
     
      ' démarage
      for each th as thread in _dico.keys
         th.Start 
       next
    end sub
     
    private sub threadtraitement
       dim dt as datatable = _dico(threading.thread.currentthread)
    end sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    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 à toi Pol 63 j'ai beaucoup appris, même si en bout de ligne je me suis rendu compte que je n'avais pas besoin d'utiliser la classe dictionairy j'ai eu l'occasion de la connaitre.

    Puis je maitrise mieux le multi-thread.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture d'un dataset en multithread
    Par Mario Rousson dans le forum VB.NET
    Réponses: 6
    Dernier message: 23/10/2013, 12h27
  2. [VB.net][PostgreSQL & ODBC] DataSet => NO_DAT
    Par rebolon dans le forum Accès aux données
    Réponses: 2
    Dernier message: 28/01/2004, 09h01
  3. [FLASH MX 2004 pro] DATASET, XML, ASP
    Par kenshi dans le forum Flash
    Réponses: 4
    Dernier message: 27/01/2004, 10h38
  4. [Win32]App multithread
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 25/09/2003, 09h57
  5. Multithreading sous HP Ux 11
    Par pykoon dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 18/10/2002, 23h36

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