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

drcmomo 182 Messages postés lundi 13 mars 2006Date d'inscription 25 décembre 2009 Dernière intervention - 23 août 2007 à 15:13 - Dernière réponse : litlefranjo 1 Messages postés jeudi 17 août 2006Date d'inscription 28 octobre 2009 Dernière intervention
- 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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 23 août 2007 à 19:21
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# 

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de MorpionMx
Neo020585 178 Messages postés lundi 10 mars 2003Date d'inscription 6 juillet 2009 Dernière intervention - 23 août 2007 à 15:19
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
drcmomo 182 Messages postés lundi 13 mars 2006Date d'inscription 25 décembre 2009 Dernière intervention - 23 août 2007 à 16:05
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
cs_sephiro 101 Messages postés dimanche 1 avril 2001Date d'inscription 18 février 2008 Dernière intervention - 23 août 2007 à 16:26
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
cs_sephiro 101 Messages postés dimanche 1 avril 2001Date d'inscription 18 février 2008 Dernière intervention - 23 août 2007 à 16:29
Commenter la réponse de cs_sephiro
litlefranjo 1 Messages postés jeudi 17 août 2006Date d'inscription 28 octobre 2009 Dernière intervention - 28 oct. 2009 à 08:03
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.