Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Thread's
hemasek
myCSharp.de - Member



Dabei seit:
Beiträge: 28
Herkunft: Österreich

Themenstarter:

Thread's

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
.unreal
myCSharp.de - Member

Avatar #avatar-1903.gif


Dabei seit:
Beiträge: 563
Herkunft: Nähe Zürich

beantworten | zitieren | melden

der Thread "stirbt", sobald er fertig mit arbeiten ist
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

beantworten | zitieren | melden

Rein aus Neugier .... warum?
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 667
Herkunft: Saarland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

.. 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.
private Nachricht | Beiträge des Benutzers