Laden...

Thread's

Erstellt von hemasek vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.540 Views
H
hemasek Themenstarter:in
28 Beiträge seit 2005
vor 18 Jahren
Thread's

Hallo Leute,

Ich habe ein paar Fragen zum Thema Thread mit Forms:
bitte entschuldigt falls ich in das Forum Windows.Forms gehöre,
aber ich glaube es gehört mehr hier her ?(

Wie kann ich eine Form in einen zusätlichen Thread starten?
Habe folgendes geschrieben:

		
private void btnAusdruck_Click(object sender, System.EventArgs e)
{
     Thread thrAusdruck = new Thread(new System.Threading.ThreadStart(showfrmAusdruck));
     thrAusdruck.Start();
}

private void showfrmAusdruck()
{
     chartAusdruck.Show();
}
			

Nur schließt sich das Form kurz nach dem öffnen wieder.
Kann mir das jemand erklären?

Besten Dank

hemasek

563 Beiträge seit 2004
vor 18 Jahren

der Thread "stirbt", sobald er fertig mit arbeiten ist

S
8.746 Beiträge seit 2005
vor 18 Jahren

Und noch ein Tipp: Niemals irgendwas mit dem GUI in einem Thread machen. Dazu gehört auch das Öffnen eines Fensters. Alternativ kannst du mittels Invoke() / BeginInvoke() Fensteroperationen von Threads aus veranlassen. Aber NIEMALS direkt.

Dein Code wird schon aus diesem Grund nicht sauber laufen.

4.207 Beiträge seit 2003
vor 18 Jahren

Rein aus Neugier .... warum?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

P
939 Beiträge seit 2003
vor 18 Jahren

Wurde doch schon so oft thematisiert.

Nur der GUI-Thread - der Thread, in dem die Forms instanziiert wurden und in dem die Windows-Botschaften-Warteschlage läuft - nur der darf direkt auf Windows-Controls zugreifen. Ansonsten gibt es Probleme. Ein Relikt aus der alten Windows-Programmierung, die nur einen einzelnen Thread erlaubt hat (Single Thread Apartment). Alle Aktionen mit Windows-Controls müssen per Botschaft über die Botschaften-Warteschlange durchgeführt werden.

In .Net 2.0 wird das mittlerweile zur Laufzeit sichergestellt. Es wird eine Exception geworfen, wenn ein anderer Thread auf die GUI zugreift. In .Net 1.1 gab es da nur nicht nachvollziehbare, merkwürdige Effekte, wenn man sich nicht daran hielt.

Ein Thread zum Thema: Threads und Controls

L
667 Beiträge seit 2004
vor 18 Jahren

Kann ich nur bestätigen und bin ich auch heute erst reingetappt :

Ich hab ein Form, in dem ein Thread gestartet wird. Nun wird in diesem Thread ein neues Form angezeigt und die ShowInTaskbar Eigenschaft auf false gestellt.

Wenn ich jetzt innerhalb dieses Threads eine Messagebox anzeige, wird beim Schliessen der Messagebox auch das Form geschlossen und man hat keine Möglichkeit mehr, das Form wieder sichtbar zu machen ...

Probiert es aus, lässt sich mit einer Testanwendung in 5 Minuten nachprogrammieren (haben wir auch gemacht weil wir es nicht glauben wollten).

Wir sind mit dem Testen noch nicht ganz fertig, aber es sieht so aus als ob beim Schliessen der Messagebox (modaler Dialog) vom Windows-BS eine Message gesendet wird, die aus irgendeinem Grund auch von dem Formular aufgefangen und abgearbeitet wird.

Das Kuriose ist, wenn man die ShowInTaskbar Property des Forms nicht auf false setzt, funktioniert alles einwandfrei.

Sehr dubios das Ganze ...

"It is not wise to be wise" - Sun Tzu

4.221 Beiträge seit 2005
vor 18 Jahren

Original von Lynix
Das Kuriose ist, wenn man die ShowInTaskbar Property des Forms nicht auf false setzt, funktioniert alles einwandfrei.

Das ist ja das Tolle an den Threading-Problemen.... sie schlagen irgendwo zu.... manchmal dezent... manchmal sehr hart.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

P
939 Beiträge seit 2003
vor 18 Jahren

.. und häufig nicht nachvollziehbar. Manchmal tritt der Effekt auf, manchmal wieder nicht und im Debugger sowieso immer ganz anders.

Also, wenn irgendwie möglich, sollte man auf Threads verzichten. Allerdings, Application.DoEvents ist kein Ersatz. Dann schon lieber Threads und sehr viel testen, dass sichergestellt ist, dass die Vorgänge immer synchron und vorhersehbar ablaufen. Threads, wenn sie auf die selben Daten zugreifen, kann man sich wie in einem rundenbasierten Strategiespiel vorstellen. Wenn ein Thread aktiv ist, müssen die anderen warten.

Das nur so nebenbei. Hat nichts mit dem "GUI <-> Thread Problem" zu tun. Da muss in jedem Fall mit Control.Invoke / Control.BeginInvoke gearbeitet werden.