Suspendre/Reprendre Thread [Résolu]

Leucistic 61 Messages postés mercredi 24 septembre 2008Date d'inscription 16 juin 2012 Dernière intervention - 4 sept. 2008 à 14:17 - Dernière réponse : leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention
- 5 sept. 2008 à 19:24
Bonjour,

J'ai crée un thread qui sert de chronomètre (affiche le temps sur un label).
Je souhaiterais pouvoir suspendre/reprendre ce thread selon les actions du user. Mais les methodes suspend/resume sont obsolète. J'ai donc voulu me pencher vers les pool de threads, mais ca me parait bien complexe pour juste un malheureux thread. Y a-t-il vraiment que le pool de threads pour faire ce que je veux ?

L'ouverture de l'esprit n'est pas une fracture du crâne
Afficher la suite 

6 réponses

Répondre au sujet
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 4 sept. 2008 à 14:39
+3
Utile
le pool de thread ne correspond pas a ton besoin...pour ce que tu veux faire, tu dois utiliser un event (systeme, pas les event avec des delegate). Regarde du coté de AutoResetEvent et ManuelResetEvent. Ainsi, a chaque execution de ta boucle, tu attend sur levent, et pour bloquer ton thread tu Reset l'event.
Sinon, pour un chronomètre, pourquoi ne pas juste utiliser un timer, tout simplement? il te suffirait de l'arreter/reprendre...ca semble bien plus adapté a ton cas (apres peut etre que tu as des contraintes qui tobligent a utiliser un thread, ds ce cas utilise les event)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de leprov
Leucistic 61 Messages postés mercredi 24 septembre 2008Date d'inscription 16 juin 2012 Dernière intervention - 4 sept. 2008 à 14:51
0
Utile
J'avais vu dans le pool de threads les manuelResetEvent mais je ne comprenais pas. Je suis déja un peu aidé, alors merci.

Je suis débutant en C# et je fais un jeu du taquin.
Il marche, mais je rajoute maintenant un chrono.
Pour m'entrainer et découvrir le plus de notions possible, j'ai crée un objet Temps qui herite de Timer. Et dans mon MainForm, je fais un thread qui appelle getTime() et l'affiche sur un label.
Je pourrais aussi ne pas arreter le thread et juste mettre Enabled de mon objet Temps à false. Mais ca me permet de coder une nouvelle notion.
L'ouverture de l'esprit n'est pas une fracture du crâne
Commenter la réponse de Leucistic
Leucistic 61 Messages postés mercredi 24 septembre 2008Date d'inscription 16 juin 2012 Dernière intervention - 4 sept. 2008 à 15:46
0
Utile
Bon j'ai lu des trucs sur les ManualResetEvent. Je pense avoir compris, néanmoins sa ne marche pas comme je veux, j'ai du oublier quelque chose.
En appuyant sur Set (qui appelle mre.Set()), le thread se lance bien (le chrono démarre).
Lorsque j'appui sur Reset (qui appelle mre.Reset()), rien ne change, et le chrono continue d'avancer.

    Temps temps = new Temps();                // Chronomètre
    Thread chronometre;                        // Thread qui affiche le temps
    delegate void dMajTime(String heure);    // Delegate du thread
    ManualResetEvent mre = new ManualResetEvent(false);
   
    public MainForm()
    {
        InitializeComponent();   
       
        chronometre = new Thread(new ThreadStart(time));
        chronometre.Start();
    }   
   
    // Thread qui met le temps à jour
    void time ()
    {
        mre.WaitOne();
        while(Thread.CurrentThread.IsAlive)
            this.Invoke(new dMajTime(majTime), temps.getStringTime());
    }
   
    // Mise à jour du temps
    void majTime (String heure)
    {
        tTemps.Text = "Temps : " + heure;
    }

    void setClick(object sender, EventArgs e)
    {
        mre.Set();
    }
   
    void resetClick(object sender, EventArgs e)
    {
        mre.Reset();
    }
L'ouverture de l'esprit n'est pas une fracture du crâne
Commenter la réponse de Leucistic
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 5 sept. 2008 à 11:13
0
Utile
private volatile bool RunClock = true;

void time ()
{
while(RunClock)
{
mre.WaitOne();
this.Invoke(new dMajTime(majTime), temps.getStringTime());
}
}

met RunClock a false lorsque tu veux arrêter ton thread. Ca sera plus propre.

(Reste qu'un timer aurait été plus propre et plus simple)
Commenter la réponse de leprov
Leucistic 61 Messages postés mercredi 24 septembre 2008Date d'inscription 16 juin 2012 Dernière intervention - 5 sept. 2008 à 18:26
0
Utile
Mais dans ces cas là, le ManualResetEvent sert à quoi ?

L'ouverture de l'esprit n'est pas une fracture du crâne
Commenter la réponse de Leucistic
leprov 1163 Messages postés vendredi 23 juillet 2004Date d'inscription 21 octobre 2010 Dernière intervention - 5 sept. 2008 à 19:24
0
Utile
a mettre le thread en attente passive. Tant que ton event n'est pas set, tu es bloqué sur cette instruction. Si ton event est set, tu peux passer. ca te permet de controler quand tu veux etre en pause
Commenter la réponse de leprov

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.