Thread + Comprends pas

Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
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 ".".



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

{


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

t->Start();

}



private : void ThreadProcess()

{

}



Si qq avait une solution,



Par avance, merci.

6 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
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 ?

Mx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
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é :



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


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() ;


sqlconnection->ConnectionString "data source conan ;integrated
security true ; initial catalog bdd" ;

sqlconnection->Open() ;



int nb_personne ;



SqlCommand * command_verif_personne = new SqlCommand() ;

command_verif_personne->CommandText = "SELECT * FROM personne" ;

command_verif_personne->CommandType = CommandType::Text ;

command_verif_personne->Connection = sqlconnection ;

SqlDataReader *
sqldatareader_verif_personne =
command_verif_personne->ExecuteReader() ;



while (sqldatareader_verif_personne->Read())

{

nb_personne++ ;

}



sqldatareader_verif_frais->Close() ;



// 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.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
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


<HR>
using System,

using System.ComponentModel;

using System.Drawing;
u
sing System.Threading;

using System.Windows.Forms;

namespace WindowsApplication1
{

public
class
Form1 :
Form
{

public Form1()
{
InitializeComponent();

this.timer1.Interval = 1000;

this.timer1.Start();
}


private
void timer1_Tick(
object sender,
EventArgs e)
{

this.timer1.Stop();

Thread t =
new
Thread(
new
ThreadStart(ThreadMethod));
t.Start();

this.timer1.Start();
}


private
void ThreadMethod()
{

Console.WriteLine(
"coucou du thread");
}


private System.ComponentModel.
IContainer components =
null;

private
void InitializeComponent()
{

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.

Mx
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
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 :



private void timer1_Tick(object sender, System.EventArgs e)

{

this.timer1.Stop();

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....
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
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.

C'est tout de meme etrange cette histoire.

Mx
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Pour le multithreading en C++ .NET y'a peut être des options de compilation.