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 :

[vb.net][Multithreading] Problème avec multithreading de masse


Sujet :

VB.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Par défaut [vb.net][Multithreading] Problème avec multithreading de masse
    Bonjour.

    J'ai un problème avec le multithreading.
    Je développe un service Windows qui va aller se connecter à n clients pour leur envoyer une commande.
    Pendant mes premiers tests, quand j'avais peu de clients connectés, tout allait bien. Mais maintenant que j'ai environ 200 clients, ca ne marche plus.

    Voici le fonctionnement actuel :
    J'ai un thread qui effectue un foreach sur la liste des clients connectés.
    Dans ce foreach, j'instancie un ManualResetEvent (situé dans un tableau), et j'appelle la fonction qui va faire la connection et tout par un ThreadPool.
    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
    For Each c In ListeClients
     
                manualEvents(i) = New ManualResetEvent(False)
     
                Dim _args As New List(Of Object)
                _args.Add(strProgName)
                _args.Add(strArgs)
                _args.Add(stream)
                _args.Add(broadcastID)
                _args.Add(c)
                _args.Add(manualEvents(i))
     
                ThreadPool.QueueUserWorkItem(AddressOf SendCommandThread, _args)
                Trace.WriteLine("Created", "ThreadpoolCommand")
                i += 1
    Next
    Et ensuite j'attends que tous les manualResetEvent soient signalés pour continuer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If WaitHandle.WaitAll(manualEvents) Then
                Trace.WriteLine("End", "ThreadpoolCommand")
                Return CHAR_ACK
    Else
                Return CHAR_NACK
    End If
    Le problème, c'est que WaitAll ne peut pas prendre en paramètre un tableau de plus de 64 manualResetEvents. D'où mon bug...

    Auriez-vous une idée pour que je puisse contourner cette limitation ?

    Merci !

  2. #2
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut
    Je suis tombé sur la même limitation il y a peu de temps.
    Après moultes recherches, la solution donnée le plus souvent (et que j'ai utilisée), est de travailler par "paquets" de 64.

    C'est pas beau, et si tu trouves une plus belle meilleure bonne solution, je suis preneur

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Je ne suis pas du tout convaincu que le ThreadPool soit l'idéal pour gérer des threads dans ce contexte.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Par défaut
    Que me proposes-tu en remplatement ?

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par actionthomas Voir le message
    Que me proposes-tu en remplatement ?
    Gérer tes threads "normalement" sans le threadpool.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Par défaut
    Dans ce cas comment faire pour savoir quand tous les threads ont terminé ?

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Plusieurs solutions mais la plus simple me semble d'allouer un ManualResetEvent (ou n'importe quel autre objet de synchro) à chaque thread, et utiliser la méthode static WaitAll pour attendre que tous les Events soient signalés.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 17
    Par défaut
    C'est ce que je fais déjà.
    C'est pas le fait de passer par un ThreadPool qui plante, mais le WaitAll qui ne peut gérer que 64 objets de synchro maximum...
    ---- Message court d'assertion ----
    Exception : Le nombre de WaitHandles doit être inférieur ou égal à 64.

  9. #9
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Ok, je devrais prendre l'habitude de lire plus attentivement avant de répondre.

    Donc, moyen simple de contourner :

    - pour chaque bloc de 64 threads, tu démarre un thread "superviseur" qui WaitAll ses 64 thread supervisées (et qui se charge de les démarrer).

    - chaque thread superviseur à lui même un Event qu'il signale quand il a fini d'attendre sur son WaitAll.

    - les event des threads superviseurs, sont eux-même WaitAll par ton ton thread initiateur des threads superviseurs.

    Donc 64x64 dispo.

    Si ce n'est pas suffisant, tu peux même appliquer la méthode de manière récursive.

    je ne connais pas le nombre de Event que peut gérer un domain d'application, vérifier si il y a une limite de ce coté.

Discussions similaires

  1. Multithreading : problème avec Abort()
    Par mrrenard dans le forum C#
    Réponses: 7
    Dernier message: 29/10/2007, 17h02
  2. [VB.net][vs2005] Problème avec les expressions régulières
    Par zouhib dans le forum Windows Forms
    Réponses: 13
    Dernier message: 22/06/2006, 15h56
  3. [VB.NET]petit problème avec la classe string !!
    Par zouhib dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2006, 11h58
  4. [VB.NET] [CR] Probléme avec Crystal Report.
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/03/2005, 14h18
  5. [.NET][GLUT] problème avec iostream
    Par polonain2 dans le forum OpenGL
    Réponses: 7
    Dernier message: 17/03/2004, 17h24

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