Thread + Comprends pas

cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 - 12 nov. 2005 à 23:48
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 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 ".".



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

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

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



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


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



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....
0

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
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.

C'est tout de meme etrange cette histoire.

Mx
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 nov. 2005 à 00:19
Pour le multithreading en C++ .NET y'a peut être des options de compilation.
0
Rejoignez-nous