Empêcher multiples threads

cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011 - 19 avril 2010 à 12:17
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 19 avril 2010 à 19:54
Bonjour,

Je travaille sur un code qui génère des graphes.
La génération du graph s'effectue dans un thread afin de permettre l'utilisation du reste de l'application.

Cependant, j'aimerais pouvoir empêcher le lancement du même thread lorsque le premier n'est pas terminé p(si l'utilisateur cliquait 2 fois sur le bouton qui déclenche le process).
Comment puis-je tester l'existence d'un thread en cours ?

Voici les portions de code impliquées:

public void Render()
{

buildGraph = new Thread(new ThreadStart(BuildCurveGraph));
buildGraph.Start();
}

private void BuildCurveGraph()
{
this.Invoke(new Set_StatusRunning(Set_StatusRunningToUser),"Building graph...");
b = BuildAxesMethod(new Bitmap(this.splitContainer1.Panel1.Width,this.splitContainer1.Panel1.Height),currentGraph);
b = BuildCurveGraphMethod(b, (Curve)currentGraph);
this.Invoke(new Return_GraphImage(Return_GraphImageToBox), b);
this.Invoke(new Set_StatusStopped(Set_StatusStoppedToUser));
}


Cordialement,

Anze.

7 réponses

cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
19 avril 2010 à 12:39
buildGraph.ThreadState == ThreadState.Running


---
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 avril 2010 à 13:23
Bonjour,

Oula non, ce test ne suffit pas : un retour false ne permet en rien de s'assurer que le thread a terminé son exécution.
Et dans le cas d'un thread d'arrière plan ce test ne retournerait jamais true.
Il est de toute façon déconseillé d'utiliser cette propriété pour autre chose que du diagnostic.

Le mieux dans ce genre de cas est encore de maintenir soit même une variable d'état du job.


/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
19 avril 2010 à 14:56
Merci pour vos réponses,

Je me tâtais justement pour mettre à jour un variable booléenne mais je ne trouvais pas ça "propre". Tant pis, j'imagine que je n'ai pas le choix.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 avril 2010 à 16:50
Au contraire (enfin, à mon avis).
Après une valeur booléenne n'est peut être pas forcément la meilleure option si à terme tu dois ajouter un support d'annulation/abandon du job de rendu durant son exécution, mais dans le cas contraire si.

/*
coq
MVP Visual C#
CoqBlog
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
19 avril 2010 à 18:57
Merci coq pour avoir corrigé mon énorme erreur.
Comme tu l'as indiqué ThreadState ne s'utilise que pour du diagnostic ou du débugage (MSDN : Thread state is only of interest in debugging scenarios. Your code should never use thread state to synchronize the activities of threads.)
Cependant rien n'est précisé pour la propriété IsAlive. Je me demande donc si elle aussi ne sert qu'au débugage ?


---
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 avril 2010 à 19:21
De rien !

Je dois avouer ne jamais m'être servi de la propriété Thread.IsAlive, préférant toujours une gestion explicite du statut de complétion du trvail exécuté par le thread (pour moi un thread terminé ne veut pas forcément dire un travail terminé, notamment en cas de crash étouffé par le code exécuté).

Si on en croit ce que dit Joseph Albahari à son sujet dans "Threading in C#", ça pourrait correspondre :

"[...] or alternatively, use the thread's IsAlive property. IsAlive, however, might not be what you want. It returns true if the thread's blocked or suspended (the only time it returns false is before the thread has started, and after it has ended)."

Source : http://www.albahari.com/threading/part2.aspx#_Thread_State (page 24 du PDF tel qu'il est à cette date)

Je ne connais pas vraiment cette propriété mais il ne me semble pas avoir vu passer d'information négative à son sujet.


/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
19 avril 2010 à 19:54
Bonsoir

je confirme que IsAlive fonctionne bien, et retourn "true" tant que le thread est présent en mémoire.
donc tant qu'il n'est pas sorti de son code d'execution.

par contre, pour empecher un thread de démarer tant qu'un autre tourne, perso , je prefere utiliser un sémaphore.
ou plutot un AutoResetEvent dans ce cas puisque l'on ne veut qu'un seul thread en execution

genre:
en global :

    //un sépmaphore critique, libre par défaut
    static AutoResetEvent autoResetEvent = new AutoResetEvent(true); 


dans la method start du thread:
private void BuildCurveGraph()
{
    System.Diagnostics.Debug.WriteLine("Thread waiting");
    // le Wait one sur une auto reset event permet d'attendre qu'il soit libre et de le bloquer automatiquement 
    autoResetEvent.WaitOne();
    // si on est ici c'est que les autres thread sont terminés ou bloqués sur le sémaphore
    System.Diagnostics.Debug.WriteLine("Thread starting");
    try
    {
        // .. ici le code du thread ..
        Thread.Sleep(3000);
    }
    finally
    {
        System.Diagnostics.Debug.WriteLine("Thread finishing...");
        autoResetEvent.Set();
    }
} 


c'est une méthode, mais il y en a d'autres, en fonction de ce que l'on veut controler...

C# is amazing, enjoy it!
0
Rejoignez-nous