Laden...

Wie kann ich aus einem Worker-Thread auf den GUI-Thread zugreifen?

Erstellt von hallochg vor 6 Jahren Letzter Beitrag vor 6 Jahren 877 Views
H
hallochg Themenstarter:in
18 Beiträge seit 2016
vor 6 Jahren
Wie kann ich aus einem Worker-Thread auf den GUI-Thread zugreifen?

Hi zusammen

Ich habe folgendes Problem.
Ich habe einen "Gui- Thread", da gibt es einen Button welcher eine Reihe von Tests auslösen soll. Diese Tests werden in einem separaten "Arbeitsthread" ausgeführt, damit das Gui nicht blockiert.

Damit der Gui- Thread nicht weiterläuft und mir die anderen Tests bereits startet habe ich ihn mit einer while versehen welche wartet bis im Arbeitsthread eine Variable gesetzt wird.
Nun will ich im Arbeitsthread eine MessageBox aufrufen -> diese sollte aber im Gui- Thread aufgerufen werden. deshalb verwende ich this.Invoke.
doch nun bleibt er hängen, ich vermute weil ich meinen Gui-Thread in einer while schlaufe habe.

Wie kann ich dieses Problem lösen? also wie kann ich verhindern dass mein Gui Thread weiter läuft und weiter tests auslöst ich aber trotzdem meine MessageBox aufrufen kann.
Ich kam schon auf die Idee die Testaufrufe ebenfalls in einen Thread zu verlagern. Ich persönlich finde das jedoch eine nicht sehr schöne Lösung. Habt ihr vielleicht andere ideen?


//GuiThread
void ButtonClick(object sender, EventArgs e)
{
   bool mWaitforThread = false;
   System.Threading.Thread newThread = new Thread(() => Function(ref mWaitforThread));
   newThread.Start();
   while(!mWaitforThread);
  //naechster Test welcher erst nach beednigung des ersten aufgerufen werden darf.
}
delegate void Ausgabe(string x, string y);
void AusgabeGui(string x, string y)
{
   //Ausgabe 
}
void Function(ref bool pWaitforThread)
{
   //do something
   Ausgabe SetGui = new Ausgabe(AusgabeGui);
   this.Invoke(SetGui,x,y);
   pWaitforThread = true;
}

Vielen Dank für eure Hilfe

hallochg

4.942 Beiträge seit 2008
vor 6 Jahren

Hallo,

Ich kam schon auf die Idee die Testaufrufe ebenfalls in einen Thread zu verlagern Doch, das wirst du so machen müssen, s. [FAQ] Warum blockiert mein GUI?.

C
2.122 Beiträge seit 2010
vor 6 Jahren

Eine Erklärung. Dein GUI Thread läuft weiter. Er läuft in der Schleife und kommt nicht mehr raus. Das nennt man in diesem Fall blockieren, denn diese sinnfreie Schleife lässt ihm keine Gelegenheit mehr sich um den Rest der GUI zu kümmern.

H
hallochg Themenstarter:in
18 Beiträge seit 2016
vor 6 Jahren

Vielen Dank für die Antworten.
Dann werde ich dies so realisieren.

Grüsse hallochg