Form in extra Thread
-
Ich habe zum Testen die Visualisierung nicht wie vorgegeben im Haupthread gestartet, sondern in einem neuen Thread.
Leider geht jetzt der Timer nicht mehr und die Funktionstasten funktionieren nicht immer. Darufhin habe ich im Haupthread Application::DoEvents() ausgeführt und der Timer funktioniert wieder, aber die Funktionstasten funktionieren nur manchmal.
An was kann das liegen? Sollte man grundsätzlich die Finger davon lassen, die Form in einem extra Thread laufen zu lassen oder kann man so etwas machen?
-
Du kannst die Form in einem anderen Thread laufen lassen.
ABER: Du darfst die Form erst in dem Thread erzeugen, wo sie auch laufen soll!!!!!Also *niemals* das Form erzeugen und dann einem Thread übergeben zum laufen lassen...
Auch musst Du zum laufen lassen das "Application::Run" ausführen...
Und der Thread muss als STAThread markiert sein.
-
Forms in nem extra Thread laufen zu lassen ist in den meisten Fällen ne blöde Idee, genauso wie Application.DoEvents einfach nur nen Relikt aus VB ist und man es so gut wie nie brauch.
Meistens verwendet man doch Threads weil irgendeine Aktion langwierig ist, auf irgendwas wartet etc. -> die lagert man in Threads aus.
Aber was macht ne Form?!? Die ist bloß da und zeichnet in Ruhe sich selbst, mehr macht eine Form nicht. Deshalb hats meist auch keinen Sinn die Form an sich auszulagern, sondern halt die Aktionen die durch z.B. ButtonClicks ausgeführt werden.Deshalb die Form im allgemeinen GUI Thread lassen, und die langen Aktionen auslagern.
Zum Timerproblem: Es gibt 3 Timerklassen im Framework, welche verwendest du? Die im Windows Forms, im Timer oder im Threading Namespace?
-
Die Idee, die dahinter steckt, ist folgende:
Ich habe mehrere Threads, die in der Applikation laufen, die Visualisierung ist nur einer davon. Es gibt einen Hauptthread, der alle Threads startet und steuert, die Initiaisierung durchführt usw. Die Visualisierung wird vom Haupthread gesteuert. Wenn bestimmte Bedingungen nicht erfüllt sind, hat das auch Auswirkungen auf die Form, bzw auf die MDI Clients der Form.
Wenn ich die Visualisierung in einem Subthread starte, kann ich den Haupthread beenden und die Visualisierung wird auch beendet, wenn sie als Backgroundthread läuft. Anders herum ist nur mit einem erhöhtem Aufwand möglich.
Als Timer verwende ich den von System::Windows::Forms, aber die Frage hat sich dank der schnellen Antwort von Jochen eh schon gelöst.
Dank an Jochen.