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 :

Thread.Suspend() et Thread.Resume()


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Thread.Suspend() et Thread.Resume()
    Bonjour Lecteurs,

    Je vx suspendre un thread et le reprendre à l'aide de deux boutons "Pause" et "Continuer" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void btnPause_Click(object sender, System.EventArgs e)
    {
    	myThread.Suspend();	
    }
     
    private void btnContinuer_Click(object sender, System.EventArgs e)
    {
    	myThread.Resume();	
    }
    Je l'ai fait avec Visual Studio 2005 ça marche (Même si ces deux méthodes sont obsolètes dans Framework 2.0).

    Avec VS 2003, l'application se bloque "Hungapp".

    Merci.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Il me semble que ces méthode sont obsolete, faudrait peut-être utiliser un autre moyen, ou faire un Thread.Abort() et réinitialiser le Thread, mais c'est pas bien propre

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Thread.Abort() va arrêter mon thread, ce qui n'est pas mon but ici.

    J'ai essayé la sous-classe AutoResetEvent [Les méthodes WaitOne() et Set()] et ça marche bien.

    Mais je cherche toujours la logique.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par 3abdssami3 Voir le message
    Thread.Abort() va arrêter mon thread, ce qui n'est pas mon but ici.

    J'ai essayé la sous-classe AutoResetEvent [Les méthodes WaitOne() et Set()] et ça marche bien.

    Mais je cherche toujours la logique.
    Bonjour 3abdssami3,

    Je suis également sur une problématique similaire (suspendre/reprendre un thread) mais Suspend() et Resume() sont désapprouvés donc j'ai cherché ailleurs et je suis tombé sur AutoResetEvent. Le hic, c'est que je trouve quasiment que des exemples où c'est utilisé pour synchroniser l'exécution de N threads et je n'arrive pas à projeter ces exemples sur mon besoin.

    Est-ce que tu peux poster un extrait de code qui explique comment tu utilises AutoResetEvent s'il te plait ?

    Merci

  5. #5
    Membre actif
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Points : 233
    Points
    233
    Par défaut
    J'ai déjà eu ce problème moi aussi et la solution était de placer des variables d'états du thread au sein de la classe qui contienne la méthode à exécuter en Thread. Exemple pour endormir le thread un laps de temps en millisecondes :
    - Une variable (sleepTime) de type int initialisée à 0
    - Le Thread contrôle la valeur de cette variable à chaque itération de la boucle principale.
    - Pour endormir le Thread, en met sleepTime = 10000;
    - Quand le boucle teste la valeur de sleepTime et la trouve > 0, appelle Thread.Sleep(sleepTime); (Réinitialise sleepTime à 0).

    On peut procéder de la même façon pour terminer le Thread en utilisant une variable de type bool que la boucle principale teste à chaque itération pour décider si il faut ou non continuer l'exécution.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par emmr.rida Voir le message
    ...
    Merci pour ta réponse

    Je me suis inspiré de ta proposition en l'adaptant pour mon cas où la suspension n'a pas de durée déterminée.

    Ce qui donne cet enchaînement :
    • Le programme démarre le thread,
    • La boucle du thread contrôle :
      • dans la condition d'itération si on a demandé l'arrêt de la tâche avec un IsAborted,
      • dans la boucle si on a demandé la suspension avec un IsSuspended auquel cas je fais AutoResetEvent.WaitOne().
    • Le programme peut relancer le thread en appelant AutoResetEvent.Set() et on met IsSuspended à false.


    Donc ça semble bien tourner comme je le souhaite de cette manière.

    Merci pour ta participation emmr.rida

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Le code solution
    Bonjour tt le monde,
    Je suis désolé pour cet éclipse.

    La solution que j'ai utilisé (Sous Fx 1.1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private bool _pauseIt = false;
    private _Pause = new AutoResetEvent(false);
    Dans la partie du code où vous voulez suspendre le thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(_pauseIt)
           _Pause.WaitOne();
    et pour rependre le thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _pauseIt = false;
    _Pause.Set();
    Pour arrêter le thread, il faut libérer l'objet AutoResetEvent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _Pause.Set();
    _Pause.Close();
    Bon développement.

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

Discussions similaires

  1. C# Thread Suspend/Resume
    Par ArnaudDev dans le forum C#
    Réponses: 11
    Dernier message: 12/07/2008, 09h47
  2. [Thread] Suspend : arrêt immédiat ?
    Par Bleys dans le forum Langage
    Réponses: 9
    Dernier message: 20/06/2008, 12h35
  3. Thread suspend impossible ?
    Par poulette3000 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 07/06/2007, 21h21
  4. [Threads] suspend and resume
    Par el3gans dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 19/09/2005, 20h56
  5. Réponses: 3
    Dernier message: 11/02/2004, 12h50

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