Laden...

invoke und eventproblem

Erstellt von gelöschtem Konto vor 17 Jahren Letzter Beitrag vor 17 Jahren 12.571 Views
Information von herbivore vor 13 Jahren

Dies ist ein Thread, auf den aus der FAQ verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

Gelöschter Account
vor 17 Jahren
invoke und eventproblem

ich bin gerade dabei mir eine klassenbibliothek zu erstellen, welches mir den asynchronen einsatz von tcp_ip ermöglicht.

alles funktioniert bis auf die tatsache, das wenn ich ein event in der klasse auslöse, das dann der fehler:
Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
auftaucht.

dank forumssuche weiß ich jetzt das ich da mit invoke ranmuss.
jedoch weiß ich nicht wirklich wie, da die klasse in dem das event ausgelöst wird eine andere ist als die klasse die die werte benötigt.

ein beispiel:

private Tcp_Ip_Server server;
        private Tcp_Ip_client client;
        
        private void Form1_Load(object sender, EventArgs e)
        {
            server = new Tcp_Ip_Server();
            server.start_listening("20000");
            server.Empfange_Daten += new Tcp_Ip_Server.Daten_Event(this.daten_da);
            client = new Tcp_Ip_client();
            client.connect_to("127.0.0.1","20000");
        }
        
        private void daten_da(object sender,daten_eventargs e)
        {
           this.Text = "server: " + e.message;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            client.send("test1");
        }

und hier ein ausschnitt aus der tcp_ip klasse mit dem eventhandler

private string letzte_daten = "";
        public string str
        {
            set
            {
                letzte_daten = value;
                daten_eventargs e = new daten_eventargs(value);
                Empfange_Daten(this, e);
            }
            get
            {
                return letzte_daten;
            }
        }

        public delegate void Daten_Event(object sender, daten_eventargs e);
        public event Daten_Event Empfange_Daten;
830 Beiträge seit 2005
vor 17 Jahren

Hallo JAck30lena,

eventuell sollte das helfen:


private delegate void setTextAsyncDelegate(string message);

private void setTextAsync(string message)
{
   if(this.InvokeRequired)
      this.Invoke(new setTextAsyncDelegate(setTextAsync), new object[]{message});
   else
      this.Text = "server: " + message;
}

private void daten_da(object sender,daten_eventargs e)
{
   setTextAsync();
}

Ps.: evtl. nicht fehlerfrei, da ohne VS verfasst.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Gelöschter Account
vor 17 Jahren

achso.. jetzt habe ich es endlich verstanden..

vielen dank

edit: fehler im beispielcode korrigiert:


private delegate void setTextAsyncDelegate(string message);

private void setTextAsync(string message)
{
   if(this.InvokeRequired)
      this.Invoke(new setTextAsyncDelegate(setTextAsync), new object[]{message});
   else
      this.Text = "server: " + message;
}

private void daten_da(object sender,daten_eventargs e)
{
   setTextAsync(e.Message);
} 

(der übergabeparameter war nicht gesetzt)