cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 2010
-
15 nov. 2005 à 18:36
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 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 :
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
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.
A voir également:
Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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)
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 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 ?
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 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.