Suspendre/Reprendre Thread [Résolu]

Signaler
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
16 juin 2012
-
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
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

6 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
16
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)
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
16 juin 2012
1
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
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
16 juin 2012
1
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
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
16
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)
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Statut
Membre
Dernière intervention
16 juin 2012
1
Mais dans ces cas là, le ManualResetEvent sert à quoi ?

L'ouverture de l'esprit n'est pas une fracture du crâne
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
16
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