Suspendre/Reprendre Thread [Résolu]

Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Dernière intervention
16 juin 2012
- 4 sept. 2008 à 14:17 - Dernière réponse :
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 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 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 4 sept. 2008 à 14:39
3
Merci
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)

Merci leprov 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de leprov
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Dernière intervention
16 juin 2012
- 4 sept. 2008 à 14:51
0
Merci
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
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Dernière intervention
16 juin 2012
- 4 sept. 2008 à 15:46
0
Merci
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
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 5 sept. 2008 à 11:13
0
Merci
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
Messages postés
61
Date d'inscription
mercredi 24 septembre 2008
Dernière intervention
16 juin 2012
- 5 sept. 2008 à 18:26
0
Merci
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
Messages postés
1163
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
21 octobre 2010
- 5 sept. 2008 à 19:24
0
Merci
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.