Statusmeldung

17/04/2008 - 09:37 von Roland Schumacher | Report spam
Hallo NG

Bei einem Projekt zeigt sich, dass gewisse Task sehr lange dauern.
Leider wurde die Anwendung nicht auf Threading ausgelegt. Jetzt wird immer
mal wieder alles blockiert.

Ich möchte aber nicht alles umbauen.

Ich stelle mir folgende Lösung vor.

- Eine neue Form (FrmStatus) mit einm Label darauf für die Meldung.
- Die Text-Eigenschaft des Labels als Property. Der Zugriff synchroniesert.

public delegate void SetMessageDelegate(string t);
public void Message(string message)
{
if (labMessage.InvokeRequired)
{
SetMessageDelegate del = new SetMessageDelegate(Message);
this.Invoke(del, new object[] { message });
}
else
{
labMessage.Text = message;
}
}


In der Blockierten Form möchte ich die FrmStatus dann in einem neuen Thread
aufrufen und immer mal wieder neue Messages übergeben.

Ich kann auch die FrmStatus mit einem Thread öffnen, aber sie wird auch
blockiert.

Wie könnte ich das lösen ohne alles umzubauen?

Gruss
Roland Schumacher
http://blog.geniali.ch/
http://jotd.geniali.ch/
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
17/04/2008 - 12:02 | Warnen spam
"Roland Schumacher" schrieb:
Bei einem Projekt zeigt sich, dass gewisse Task sehr lange dauern.
Leider wurde die Anwendung nicht auf Threading ausgelegt. Jetzt wird immer
mal wieder alles blockiert.

Ich möchte aber nicht alles umbauen.

Ich stelle mir folgende Lösung vor.

- Eine neue Form (FrmStatus) mit einm Label darauf für die Meldung.
- Die Text-Eigenschaft des Labels als Property. Der Zugriff
synchroniesert.

public delegate void SetMessageDelegate(string t);
public void Message(string message)
{
if (labMessage.InvokeRequired)
{
SetMessageDelegate del = new SetMessageDelegate(Message);
this.Invoke(del, new object[] { message });
}
else
{
labMessage.Text = message;
}
}


In der Blockierten Form möchte ich die FrmStatus dann in einem neuen
Thread
aufrufen und immer mal wieder neue Messages übergeben.

Ich kann auch die FrmStatus mit einem Thread öffnen, aber sie wird auch
blockiert.



Sinnvollerweise sollten alle Formulare im gleichen (Haupt-)Thread erstellt
werden und laufen. Was spricht denn dagegen, einfach die blockierenden
Methoden in separate Threads auszulagern und, wie in Deinem Beispiel oben
gezeigt, mit 'Control.Invoke'/'Control.BeginInvoke' darauf zuzugreifen?

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen