MultiThread(pitié aidez moi) [Résolu]

Messages postés
182
Date d'inscription
lundi 13 mars 2006
Dernière intervention
25 décembre 2009
- - Dernière réponse : litlefranjo
Messages postés
1
Date d'inscription
jeudi 17 août 2006
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);

}}}}
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
3
Merci
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# 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Dernière intervention
6 juillet 2009
0
Merci
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
<!--
Commenter la réponse de Neo020585
Messages postés
182
Date d'inscription
lundi 13 mars 2006
Dernière intervention
25 décembre 2009
0
Merci
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éé.
Commenter la réponse de drcmomo
Messages postés
101
Date d'inscription
dimanche 1 avril 2001
Dernière intervention
18 février 2008
0
Merci
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
Commenter la réponse de cs_sephiro
Messages postés
101
Date d'inscription
dimanche 1 avril 2001
Dernière intervention
18 février 2008
Commenter la réponse de cs_sephiro
Messages postés
1
Date d'inscription
jeudi 17 août 2006
Dernière intervention
28 octobre 2009
0
Merci
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)
Commenter la réponse de litlefranjo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.