Problème de thread encore.... [Résolu]

Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
-
Bonjour à tous,



J'ai un problème avec les threads, c'est tjs le même problème dont
j'avais parlé a Mx avec qq variantes tout de même histoires de rigoler.



J'ai un timer et chaque fois que l'evement Tick de se timer se
délclenche je lance un thread et dans ce thread je me connecte à une
base de donnéees pour voir si y'a du nouveau a telecharger ou pas. Donc
en faite j'ai l'événement Tick dans lequel je lance mon Thread :



private: System::Void timer_verification_Tick(System::Object * sender, System::EventArgs * e)

{

t = new Thread(new ThreadStart(this,&Form1::ThreadProcess));

t->Start();

}



et dans ThreadProcess je lance cette fonction :qui est une
fonction qui lance un second timer qui va faire en sorte d'alterner une
icone puis l'autre sur le notifyicon



void Demarrer_Clignotement_Icon()

{

timer_clignotement_icon->Interval = 1000 ;

timer_clignotement_icon->Start() ;

}



private: System::Void
timer_clignotement_icon_Tick(System::Object * sender,
System::EventArgs * e)

{

switch (clignotement_icon_bool)

{




case true : this->notifyicon->Icon = new
System::Drawing::Icon(Convert::ToString("c:\\statut\\saisie.ico"));



clignotement_icon_bool = false ;



break ;


case false : this->notifyicon->Icon =
new
System::Drawing::Icon(Convert::ToString("c:\\statut\\saisie_r.ico"));



clignotement_icon_bool = true ;



break ;

}

}



Le problème c'est que ca clignote pas. Ca doit être parceque la
fonction est lancé depuis un Thread parceque quand c lancé "normalement
"ca marche. Quelqun aurait t'il un avis sur la question ?



Par avance, merci.

7 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
tu n'as aucune exception ?

Sébastien FERRAND
[MVP C#]
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Tu as bien associé ta méthode timer_clignotement_icon_Tick a l'evenement tick de ton timer ? (Je pense que oui, mais comme je vois pas la ligne, je prefere te demander, on sait jamais)

Mx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Enfin bon, de toutes facons, appeler un clignotement le l'icone de la MainForm depuis un autre thread que le thread de la MainForm ca risque de te creer plein de problemes.
Je viens de faire un test en appelant un délégué depuis le seconde thread, et ca fonctionne. Je met le code en forme et je te le poste

Mx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Voila, c'est cadeau

Mx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Tres juste.

Synchrone = Bloquant le thread.
Asynchrone, ca attend pas la fin de la méthode pour continuer.
Et tu as bien compris la différence entre invole et BeginInvoke.

Maintenant, le 2eme but de l'utilisation d'un délégué dans ce cas, c'est justement que c'est ton second thread qui doit donner l'ordre de faire le clignotement d'icone. Icone du NotifyIcon créé par le thread principal. C'est donc effectivement logique et conceptuellement plus propre d'executer ce clignotement a partir du thread principal. D'où l'appel de la méthode Invoke, qui elle, se fiche bien du thread executant la méthode.

En fait, c'est vraiment tout con. Mais il faut le savoir.

Quand j'aurais plus de temps, je completerais ma source avec un second exemple plus concret

Mx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Merci bcp pour ce code, j'ai essayé et ca marche, j'ai pas trop compris
pourquoi alors j'ai lu ton tutorial et ce que j'ai compris en faite
c'est que :



un appel synchrone c'est si par exemple dans une fontion A j'appelle
une fonction B, le reste tu code qui suit l'appelle a la fonction
B ne s'executera qu'une fois la fontion B terminé.



un appelle asynchrone c'est quand dans ma fontion A j'appelle ma fontion B via un thread les deux s'executeront en parallèle.



Dans le code que tu utilises comme ThreadMethod est une méthode appellé
via un thread donc asynchrone, tu utilise un délégué pour pouvoir
communiquer avec le thread principal ce qui est plus propre que
de modifier un objet créer par le thread principal via un autre Thread.
En faite le thread qui appelle la fonction pour clignoter au lieu de
s'executer en sychrone c'est a dire le thread attend que le fonction
clignotement() soit finis pour mourir est executer en asynchrone le
thread lance la fonction reprend la main immediatement et meurt du
coup. J'ai bon ?
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Dès qu'on veut modifier une propriété du thread appellant on utilise
Invoke quand ca retourne rien ou begininvoke quand ca retourne qq chose
si je comprends bien.