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

C# Discussion :

Multithreading


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 241
    Points : 83
    Points
    83
    Par défaut Multithreading
    Bonjour,

    j'ai une boucle while et le comportement que j'aierais en fait c'est que lorsque je clique sur le bouton "RUN" ma boucle se lance (la pas de problème) mais je voudrais que quand on clique sur "STOP" ma boucle s'arrête...

    quelle méthode ou object définir das mon while ?

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    tu boucle sur la valeur d'un booleen et avec ton bouton tu changes la valeur du booléen.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    tu peux essayer de definir une variable que ta boucle testera à chaque iteration (et au besoin sortira). Je te propose ca :

    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
            private void btnRun_Click(object sender, EventArgs e)
            {
                m_continue = true;
                ThreadPool.QueueUserWorkItem(new WaitCallback(Traitement));
            }
     
            private void Traitement(object state)
            {
                label1.Invoke(new MethodInvoker(delegate { label1.Text = "Running"; }));
     
                while (true)
                {
                    //traitement
                    Thread.Sleep(500);
                    if (!m_continue)
                        break;
                }
     
                label1.Invoke(new MethodInvoker(delegate { label1.Text = "Stopped"; }));
     
            }
     
            private void btnStop_Click(object sender, EventArgs e)
            {
                m_continue = false;
            }
    C'est pas tres propre, mais ca fait le job. =)

    edit : grillé

  4. #4
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 241
    Points : 83
    Points
    83
    Par défaut Arret de Boucle sur un bouton + THREAD
    Cela tombe bien que tu utilise un tread car c'est justement de quoi j'ai besoin... je fais un test de lien HTTP dans mon traitement mais le hic c'est que je dois faire 500 tests !!!

    pour accélérer le processus, estce que je peux lancer un thread avec comme paramètre l'adresse à tester ?

    et pendant que le test s'effectue, j'en lance d'autres ...

  5. #5
    Nip
    Nip est déconnecté
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    963
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 963
    Points : 1 076
    Points
    1 076
    Par défaut
    Jette un oeil de ce cote: http://www.codeproject.com/csharp/Si...select=2178617 Ca repondra a tes questions

  6. #6
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    j'aime po l'anglais lol, mais jvais m'en debrouiller merci beaucoup ca a l'air d'être ça !

    mais il reste une petite choze au niveau des thread que je n'arive pas à comprendre ... Comment lancer plusieurs thread avec des paramètres différents.. par exemple: je lance un thread avec une adresse IP, puis le temps que le thread fasse le traitement, j'en lance un second, etc...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    soit tu créé une classe de thread dédiés personnelle où chaque instance représente un thread auquel tu peux assigner une valeur de "départ"...
    j'ai d"ailleurs déjà évoqué cette méthode dans le forum...

    ou tu lis ma réponse à un autre post que tu as deja demandé qui consiste à créer une filte de valeur et chacun de tes threads va dépiler une valeur sur cette liste "commune"... la valeur dépilée est l'adresse à traiter.
    Temps que tu n'oublie pas les synchroniser lors de l'accès à cette liste en méttant l'accès à cette list dans un bloc lock(){} ca ne pose aucun probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    string host = null;
    lock(s_Locker) host = s_Liste.Pop();
    ...
    /* ici host vaut la valeur à tester... tu vérifie si c'est null, si c'est null ou que tu as eu une exception c'est qu'il n'y a plus rien à traiter.
     */

  8. #8
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Dis SirJulio, pourquoi tu fais pas le teste de ton bool comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Traitement(object state)
    {
       label1.Invoke(new MethodInvoker(delegate { label1.Text = "Running"; }));
       m_continue = true;
       while (m_continue)
       {
           //traitement
           Thread.Sleep(500);
       }
     
       label1.Invoke(new MethodInvoker(delegate { label1.Text = "Stopped"; }));
    }
    A la fin, ton thread sort tout seul... C'est pas plus propre ?

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    juste histoire d'empecher tout le monde de tourner en rond...

    ce code foncionne bien à condition que le membre m_continue soit déclaré comme "volatile", sinon vous allez rigoler si deux thread essaie l'accès "simultannées".

    En général on synchronise le thread sur l'accès aux flags que d'autres threads externes peuvent modifier, ou comme deja dit, on met ce flags en volatile.
    cela évite certains optimisations et améliorations, et mécanismes de gestion de la variable qui sont "inutiles" dans ce cas.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par ppphil Voir le message
    Dis SirJulio, pourquoi tu fais pas le teste de ton bool comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Traitement(object state)
    {
       label1.Invoke(new MethodInvoker(delegate { label1.Text = "Running"; }));
       m_continue = true;
       while (m_continue)
       {
           //traitement
           Thread.Sleep(500);
       }
     
       label1.Invoke(new MethodInvoker(delegate { label1.Text = "Stopped"; }));
    }
    A la fin, ton thread sort tout seul... C'est pas plus propre ?
    Salut,

    en fait c'est equivalent, c'est juste pour permettre une sortie d'une boucle while par une variable n'etant pas la variable de reference du while (le true etant un exemple), car je suppose que si il veut arreter un while, il existe deja une condition de reference. =)

    NB: Cinemania a raison, j'avais oublié d'inclure un mecanisme pour les accès multithread, donc a voir suivant l'operation, comme il le precise, entre un lock ou un volatile

  11. #11
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Je tiens à préciser que dans un while on peu mettre plusieurs condition de sortis en jouant avec les && et les || .
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

Discussions similaires

  1. [Kylix] Multithreads la galère
    Par Oyoboy dans le forum EDI
    Réponses: 16
    Dernier message: 16/07/2004, 11h03
  2. [WinAPI C++] MultiThreading et PostMessage
    Par Gruik dans le forum Windows
    Réponses: 7
    Dernier message: 29/03/2004, 15h58
  3. [WinAPI C++] MultiThreading?
    Par Gruik dans le forum Windows
    Réponses: 2
    Dernier message: 25/03/2004, 00h08
  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