Problème de thread encore....

Résolu
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 15 nov. 2005 à 18:36
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 16 nov. 2005 à 11:15
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

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 nov. 2005 à 19:40
tu n'as aucune exception ?

Sébastien FERRAND
[MVP C#]
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 nov. 2005 à 21:47
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
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 nov. 2005 à 22:09
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
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 nov. 2005 à 22:31
Voila, c'est cadeau

Mx
3

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

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
16 nov. 2005 à 11:15
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
3
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
16 nov. 2005 à 10:56
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 ?
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
16 nov. 2005 à 11:01
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.
0
Rejoignez-nous