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

cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 15 nov. 2005 à 18:36 - Dernière réponse : MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention
- 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.
Afficher la suite 

7 réponses

Répondre au sujet
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 15 nov. 2005 à 19:40
+3
Utile
tu n'as aucune exception ?

Sébastien FERRAND
[MVP C#]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sebmafate
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2005 à 21:47
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2005 à 22:09
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 nov. 2005 à 22:31
+3
Utile
Voila, c'est cadeau

Mx
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 16 nov. 2005 à 11:15
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MorpionMx
cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 16 nov. 2005 à 10:56
0
Utile
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 ?
Commenter la réponse de cs_emmanuel9
cs_emmanuel9 903 Messages postés mercredi 23 février 2005Date d'inscription 16 juin 2010 Dernière intervention - 16 nov. 2005 à 11:01
0
Utile
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.
Commenter la réponse de cs_emmanuel9

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.