MultiThread(pitié aidez moi)

Résolu
drcmomo Messages postés 182 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 25 décembre 2009 - 23 août 2007 à 15:13
litlefranjo Messages postés 1 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 28 octobre 2009 - 28 oct. 2009 à 08:03
Bonjourt tout le monde !!
 voila je sais que vous allez me dire de regarder ici :http://www.csharpfr.com/tutoriaux/CSHARP-OPERATIONS-CROSS-THREADS-UTILISATION-DELEGATIONS-SYNCHRONES-ASYNCHRONES_174.aspx
Mais je je l'ai fais des centaines de fois
Je travail sur un lecteur code-barre , ma fonction datareveid cree  son propre  thread, je fais une petite application en dehors de mon projet (regardez ci-dessous)
Quand je click sur le bouton 1 qui est le thread pricipal pas probléme , mais quand je click sur les autre sça beug il doit me manque un petit truc que j'ai du mal a trouver.
Pas pitié pour un nul en C# AIDEZ MOI PLEASE PLEASE

namespace TestMultithead
{

public
partial
class
start :
Form{

private
int MainThreadId;

public start(){

InitializeComponent();

MainThreadId =

Thread.CurrentThread.ManagedThreadId;

Thread.CurrentThread.Name =
"IG";

}

private
void button1_Click(
object sender,
EventArgs e){

Method_Sync();

}

private
void button2_Click(
object sender,
EventArgs e){

Thread t =
new
Thread(
new
ThreadStart(
/*afficheFenetre)*/Method_Sync));t.Name =

"thread_aux";t.Start();

}

 

private
void afficheNomDansConsole(){

Console.WriteLine(
Thread.CurrentThread.Name);}

SerialPort comPort;

private
delegate
void
SyncDelegate(
/*object sender, EventArgs e*/);

private
void Method(){

if (
Thread.CurrentThread.ManagedThreadId != MainThreadId){

SyncDelegate del =
new
SyncDelegate(Method_Sync);textBox1.BeginInvoke(del,

new
object[] {
DateTime.Now,
EventArgs.Empty });}

else{

Method_Sync();

}

}

private
void button3_Click(
object sender,
EventArgs e){

comPort =

new
SerialPort(
"COM1", 9600,
Parity.Odd, 8,
StopBits.One);comPort.Handshake =

Handshake.XOnXOff;comPort.DataReceived +=

new
SerialDataReceivedEventHandler(comPort_DataReceived);comPort.Open();

comPort.DtrEnable =

true;}

private
void comPort_DataReceived(
object sender,
SerialDataReceivedEventArgs e){

Thread.CurrentThread.Name =
"comport";

 Method_Sync();

}

private
void button4_Click(
object sender,
EventArgs e){
comPort.DtrEnable false;comPort.DtrEnable

true;

byte[] tab = { 0x01, 0x02, 0x00, 0x9F, 0xDE };comPort.Write(tab, 0, 5);

}

private
void button5_Click(
object sender,
EventArgs e){
comPort.DtrEnable false;comPort.DtrEnable

true;

byte[] tab = { 0x07, 0x2, 0x00, 0x9F, 0x3E };comPort.Write(tab, 0, 5);

}

private
void button6_Click(
object sender,
EventArgs e){

comPort.Close();

this.Close();}

private
void Method_Sync(
){

int i = 0;

while (i < 20){

this.textBox1.AppendText(
Thread.CurrentThread.Name +
"\n" );i += 1;

Thread.Sleep(1000);

}}}}

6 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
23 août 2007 à 19:21
Salut,

Si tu avais vraiment lu le tutorial 100 fois, et si tu prenais le temps de lire l'erreur pourtant très explicite, tu verrais que tu ne peux pas changer le texte de ta TextBox dans la méthode Method_Sync, puisque celle ci a été crée par un autre Thread !

Donc en gros, dans ton code tu ajoutes :

 private delegate void ChangeTbx(Control ctrl, string str);
 private void ChangeTbxText(Control ctrl, string str)
 {
     ctrl.AppendText(str);
 }

Et dans Method_Sync, a la place du Textbox1.Text=..., tu mets

this.Invoke(new ChangeTbx(ChangeTbxText), textBox1, Thread.CurrentThreadName + "\n");

Comme expliqué dans le tutorial

Mx
MVP C# 
3
Neo020585 Messages postés 178 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 6 juillet 2009 4
23 août 2007 à 15:19
Peux-tu indiquer le message d'erreur lors de la compilation ou de l'exécution s'il te plait ? Ca aiderai à comrpendre ton problème.

"Une chose me laisse perplexe : Est-ce moi ou les autres qui sont fous ?" A. Einstein
<!--
0
drcmomo Messages postés 182 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 25 décembre 2009
23 août 2007 à 16:05
l'erreur est la suite:
Opération inter-threads non valide : le contrôle 'textBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
0
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
23 août 2007 à 16:26
Bonjour drcmomo
Un thread autre que le principale ne peux pas accéder aux controles, sauf queqlues modifications de base, tu dois donner l'instance du thread principale au thread secondaire, puis tu appelles une fonction de ton thread principale par un Invoke, cette fonction pourra accéder à ton textbox.
J'avais trouvé un exemple sur ce site je le recherche et je l'ajoute à mon prochain post

Sephiro
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sephiro Messages postés 101 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 18 février 2008
23 août 2007 à 16:29
0
litlefranjo Messages postés 1 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 28 octobre 2009
28 oct. 2009 à 08:03
believe and trust, En fait, pour une question de sécurité et de cohérence, visual studio n'autorise pas la modification d'un contrôle par un thread autre que celui qui la créé? imagine un instant que pendant qu'un thread change la police d'un label en la mettant à 12 et qu'un autre en fait de même au même moment en la mettant à 9, on peut vite forcer le controle dans un état incohérent. le même problème peut survenir dans bien des cas.
toute fois, vb ne ns laisse pas sur notre fin
tu peu demander à vb d'autoriser celà en définissant la propriété checkforillegalcrosscontrolprocess à false pour le contrôle qui doit faire l'objet d'une modification par ton (ou tes...) thread(s)
0
Rejoignez-nous