cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 2010
-
12 nov. 2005 à 23:48
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
14 nov. 2005 à 00:19
Bonsoir à tous,
J'ai un problème avec les threads que je comprends pas, j'ai un timer
qui déclenche l'evenement tick toutes les secondes et ce timer lance un
tread qui lui même lance une fonction"ThreadProcess()" qui ne fait
rien. Mais moi appli rame comme c'est pas possible pourquoi ?
normalement une fois la fonction "ThreadProcess" terminé le thread
devrait "mourir" de lui même... C'est du c++.net pareil que le c# il
faut juste enlever les "*" et remplacer les "->" par des ".".
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 13 nov. 2005 à 10:24
Je viens de tester ton code, et ca m'a pas l'air de ramer :/ Pourtant je suis loin d'etre sur une machine de guerre en ce moment. Peut-etre parce que je suis sur du .Net 2.
C'est peut-etre aussi parce que mon appli est "vide" que ca rame pas :p
Enfin bref, quelques pistes :
-Change le parametre Priority de ton Thread
-Met le parametre IsBackground de ton Thread a true (meme si ca changera pas pour les perfs ca)
-Pense tu vraiment qu'il est judicieux de reinstancier un thread chaque seconde ?
-A la propriété Interval de ton timer, tu as bien mis 1000, et pas 1 ?
J'ai regardé un peu la doc, en c++.net , là où toi tu passes this en parametre a ThreadStart, eux ils passent 0. C'est bien parce que ils utilisent une méthode static, c'est ca ? (C'est ce que jai compris, mais je prefere etre sur)
Si je me souviens bien d'une precedente conversation, ton thread c'est pour verifier que y'a pas de nouvelles entrees en bdd, c'est bien ca ?
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 13 nov. 2005 à 15:10
Merci de ta réponse si complète, pour la propriété interval de mon
timer j'ai bien mis 1000, c pour tester en faite mais même si je la
mets à 10000 ca ramera au bout de 10 secondes. Le "ramage" se fait
quand je deplace ma form ca saccade comme pas possible. Ce que je
voudrais c'est que ca provoque aucun ralentisement, que ce soit
totalement transparant. Oui le 0 c'est parceque il utilise une méthode
static j'ai essayé :
t = new Thread(new
ThreadStart(0,&Form1::ThreadProcess));
t->Start();
}
private : void static ThreadProcess()
{
}
et ca fait pareil. IsBackRound = true ; ne change rien non plus
malheureusement. Oui c'est ca dans mon thread, dans la fonction
ThreadProcess je vais mettre qq chose dans ce gout là pour tester ma
base :
SqlConnection * sqlconnection = new SqlConnection() ;
// Affiche le nombre de personne dans le contextmenu et faire clignoter le notifyicon si possible
sqlconnection->Close() ;
Enfin c pas la version final c juste pour tester. Pourrais tu m'envoyer
le code que tu as tester pour que j'essaye sur mon pc voir si ca fait
pareil ? Mon pc est athlon xp 2000 avec 512 mo de ddr 333mhz, c'est pas
récent récent mais date pas de la guerre de cessesion non plus.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 13 nov. 2005 à 15:31
Voila le code.
Simple adaptation du tien en C#
Et la je suis sur un piti portable @1400 Mhz, 256Mo de ram
quand je lance l'appli, le cpu est utilisé en moyenne a 10% pour tous les processus qui tournent
this.components =
new System.ComponentModel.
Container();
this.label1 =
new System.Windows.Forms.
Label();
this.timer1 =
new System.Windows.Forms.
Timer(
this.components);
this.SuspendLayout();
this.label1.AutoSize =
true;
this.label1.Location =
new System.Drawing.
Point(125, 136);
t
his.label1.Name =
"label1";
this.label1.Size =
new System.Drawing.
Size(35, 13);
this.label1.TabIndex = 0;
this.label1.Text =
"label1";
this.timer1.Tick +=
new System.
EventHandler(
this.timer1_Tick);
this.Controls.Add(
this.label1);
this.ResumeLayout(
false);
this.PerformLayout();
}
private System.Windows.Forms.
Label label1;
private System.Windows.Forms.
Timer timer1;
}
}
<HR>
J'ai ajouté un label, pour voir si quand je bougeais la form, il mettait du temps a se rafraichir, mais nada.
Tu aurais pas une exception qui serait levée en boucle, que tu catcherais, mais que tu aurais oublié de logger ? (donc invisible a tes yeux). Ca pourrait avoir le meme effet que les symptomes que ton appli ressent.
cs_emmanuel9
Messages postés903Date d'inscriptionmercredi 23 février 2005StatutMembreDernière intervention16 juin 20102 13 nov. 2005 à 15:50
J'ai essayé ton code et effectivement aucun ralentissement mes les
projet Windowsapplication en c# mettent bcp moins de temps à demarrer
que les projet windows form en c++.net je sais pas si y'a un rapport.
J'ai essayé le code :
Thread t = new Thread(new ThreadStart(ThreadMethod));
t.Start();
this.timer1.Start();
label1.Text = Convert.ToString(t.IsAlive) ;
}
Et il me renvoi que le thread est "En vie" True pour t.IsAlive alors
que normalement ca devrait pas être le cas ? Ca depend peut être
label1.Text = Convert.ToString(t.IsAlive) ; s'execute peut être
avant que le fonction ThreadMethode n'est eu le temps de se finir.
Quand je bouge la form et que ca rame le cpu est utilisé a 18% en
moyenne donc c pas une limite du processeur. Non je lève aucune
exception sur mon appli. Mystère....
Vous n’avez pas trouvé la réponse que vous recherchez ?
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 13 nov. 2005 à 15:57
Pour le label qui prend la valeur true, c'est le cas si ton thread est toujours en vie lors du passage a la ligne label1.Text
Le but de l'appel a un 2eme thread est justement de ne pas bloquer l'appli pendant un traitement de données. Donc apres l'appel de t.Start(); les lignes de codes suivantes vont etre apprelées normalement, et les lignes de codes qu'exectue ton Thread t seront appelées simultanément. Je pense donc que c'est normal.