Seite 1 von 1

[c#]form aus thread updaten

Verfasst: 07.03.2011, 18:01
von erikh
Hallo leute!

ich bin gerade am verzweifeln. ich möchte aus einem seperaten thread eine form updaten. und bekomme beim kompilieren folgenden fehler:

Code: Alles auswählen

Fehler CS0120: Für das nicht statische Feld, die Methode oder die Eigenschaft "LineScanView.Form1.label8" ist ein Objektverweis erforderlich.
ich habe gegoogelt und dabei kam heraus das ich mit invokes arbeiten muss. allerdings habe ich bei keiner der erklärungen verstanden wie das genau funktioniert und wie ich das in meinen code einbaue.
könnt ihr mir helfen?

ich habe meine klasse und das thread objekt:

Code: Alles auswählen

namespace LineScanView
{
    public partial class Form1 : Form
    {
        Thread _read = new Thread(Read);
        ...
bei einem button-klick starte ich den thread:

Code: Alles auswählen

_read.Start();
und in dem thread möchte ich nun ein label ("label8") updaten. genauer gesagt den text darin.

Code: Alles auswählen

public static void Read()
        {
            while (_run)
            {
            ...
            label8.Text = _node.Attributes["method"].InnerText;
            ...
            }
       }
könnt ihr mir das evtl. idiotensicher erklären?

vielen dank schon mal!

Grüße, erik

Re: [c#]form aus thread updaten

Verfasst: 07.03.2011, 21:17
von NeuroCoder
Hallo erik,

deine Read-Funktion ist static und kann deshalb nicht auf die (nicht-statischen) Felder der Klasse zugreifen. Das sagt dir die Fehlermeldung.

Um Threads zu verwenden, ist das static jedoch gar nicht erforderlich.
Wie du richtig bemerkt hast, kannst du nur aus dem GUI-Thread auf die GUI zugreifen und musst deshalb mit Invoke() aus deinem Thread in den GUI-Thread wechseln.

Im MyCSharp.de Forum gibts in den FAQ gleich drei Einträge, die dir weiterhelfen:
http://www.mycsharp.de/wbb2/thread.php?threadid=21723
http://www.mycsharp.de/wbb2/thread.php?threadid=27992
http://www.mycsharp.de/wbb2/thread.php?threadid=33113

Mfg NeuroCoder

Re: [c#]form aus thread updaten

Verfasst: 08.03.2011, 12:30
von odenter
Warum willst Du das denn machen? Also was soll da passieren in dem Form und was macht der andere Thread genau?

Re: [c#]form aus thread updaten

Verfasst: 08.03.2011, 13:41
von erikh
also der zweite thread ist für datenempfang über tcp/ip zuständig. er empfängt einfach nur die ganze zeit alles was über die leitung ankommt.
und im form sollen dann die angekommenen daten dargestellt werden.

ich möchte dabei aber unbedingt verweiden, das das gui blockiert wird, falls minutenlang keine nachricht kommt (was durchaus möglich ist) - deshalb der thread.

also meiner meinung nach nichts außergewöhnlich spektakuläres.

und deshalb frage ich mich da wieso das mit .net so ewig komplizert und nervig ist...

ich vermisse die guten c++ pointer...

gruß, erik

Re: [c#]form aus thread updaten

Verfasst: 08.03.2011, 14:05
von NeuroCoder
Hallo erik,

das ist in .NET auch nicht kompliziert, siehe meine Links.
Übrigens gibt es für deinen speziellen Anwendungsfall auch Beispiele:
http://www.mycsharp.de/wbb2/thread.php? ... #post44336
http://www.mycsharp.de/wbb2/thread.php?threadid=19670

Ich verweise auch explizit auf die Klassen TcpClient und die Funktion NetworkStream.BeginRead().

EDIT: Na gut, dann hier doch ein Minimalbeispiel (ungetestet):

Code: Alles auswählen

public class MeineForm : Form
{
public void Blubb()
{
   Thread thread = new Thread(new ThreadStart(DoSomethingInThread));
   thread.Start();
}  

private void DoSomethingInThread()
{
    ChangeMyLabel("Hallo");
}

private void ChangeMyLabel(string text)
{
   if (InvokeRequired)
   {
      this.Invoke(() => ChangeMyLabel(text));
      return;
   }
   // Ab hier sind wir auf jeden Fall im GUI-Thread
   label.Text = text;
}
}
Mfg NeuroCoder

Re: [c#]form aus thread updaten

Verfasst: 08.03.2011, 14:12
von Top-OR
Darf ich hier, um die Verwirrung komplett zu machen, kurz mit viel C#-Halbwissen (bzw. „Viertelwissen“) glänzen? Ich denke mal laut:

Meine erster Gedanke war: Kannst du dem TCP/IP-Interface nicht sagen, dass es Non-Blocking sein soll? Dann könntest du es im Main-Thread mit abfackeln.

Da es dann in einen Loop muss, müsstest du dann im Loop auch die Windows-Messages mit handlen. Das geht ja normalerweise automatisch, nur wenn du in nem loop bist, blockiert der Message Handler. Du müsstest den dann zusammen mit dem TCP-Interface den Messagehandler manuell pollen. Soweit ich weiß, gibt’s irgendwo ne simple Funktion, dies zu tun in C#, sowas wie Application.DoEvents(); war glaube ich...

Im Prinzip meine ich sowas in der Art von:

Code: Alles auswählen

while (true) {
	m_TcpObject.handleNonBlocking(); // wie auch immer das in C# läuft
	Application.DoEvents();	
	if (isAborted()) break;
}
Aber kommt man wirklich NICHT an die Fensterelemente ran im Thread, auch wenn das Callback non static ist? Wenn wirklich nicht, dann schreib doch das Ergebnis vom TCP-Handler in eine (Member-)Variable. Im Haupt-Thread prüfst du per Timer (oder per „Event deiner Wahl“), ob sich die Variable geändert hat und verarbeitest Sie. Ich weiß nicht, wie man in C# evtl. den Variablenzugriff noch durch Mutexe, etc. synchronisieren muss...

Re: [c#]form aus thread updaten

Verfasst: 08.03.2011, 16:55
von erikh
Danke erst einmal für die antworten.

Ich hatte bis jetzt leider noch keine richtige Zeit mir die Links anzusehen und durchzuarbeiten.

Aber in der hoffnung das die mir weiter helfen werden und ich in den nächsten tagen zeit dafür finde sage ich schon mal danke.

andernfalls hört ihr wieder von mir ;)

Viele grüße, der erik

Re: [c#]form aus thread updaten

Verfasst: 09.03.2011, 16:01
von odenter
Delegates bzw. anonyme Methoden sind Dein Freund, ausserdem InvokeRequired, wie in dem entsprechendem Link angegeben.
Und die Verwendung von DoEvents würde ich mir gar nicht erst angewöhnen, oder am besten gleich wieder abgewöhnen.

Re: [c#]form aus thread updaten

Verfasst: 09.03.2011, 18:44
von Top-OR
odenter hat geschrieben: Delegates bzw. anonyme Methoden sind Dein Freund, ausserdem InvokeRequired, wie in dem entsprechendem Link angegeben.
Oooh, Delegates. Sieh an, wieder was gelernt: Quasi ne "neu-moderne" Form von "Function-Pointer-Objekten", wenn ich das mal so wirr umschreiben darf?!?
odenter hat geschrieben:Und die Verwendung von DoEvents würde ich mir gar nicht erst angewöhnen, oder am besten gleich wieder abgewöhnen.
Naja, zugegeben, sonderlich elegant isses wirklich nicht. Mehrere Punkte im Code zum Messages pollen sind schon unorthodox - halt eher ne Krücke.

Re: [c#]form aus thread updaten

Verfasst: 09.03.2011, 18:58
von odenter
Top-OR hat geschrieben:
odenter hat geschrieben: Delegates bzw. anonyme Methoden sind Dein Freund, ausserdem InvokeRequired, wie in dem entsprechendem Link angegeben.
Oooh, Delegates. Sieh an, wieder was gelernt: Quasi ne "neu-moderne" Form von "Function-Pointer-Objekten", wenn ich das mal so wirr umschreiben darf?!?
Ja genau. :)