"We are back" « oc.at

[.net] (Visual Basic) Windows Forms + Multithreading = Kopfschmerzen!

Mr. Zet 28.04.2009 - 18:30 929 0
Posts

Mr. Zet

Vereinsmitglied
resident spacenerd
Avatar
Registered: Oct 2000
Location: Edge of Tomorrow
Posts: 12047
Ich bekomme noch die Krise mit dem Zeugs.

Ausgangslage:
VB.net Projekt mit mainWindow, Splashscreen, (Passwort)Dialog.

Soweit ich das beurteilen kann, wir der Splashscreen während der load-Methode des mainWindow angezeigt.
Nachdem die ganze Applikation initialisiert wurde, soll zuletzt der PWDialog angezeigt werden, bevor das MainWindow sichtbar wird - denn vom Passwort hängt ab, auf welche UI Elemente der Benutzer zugreifen kann.

Problem(e):
-) Wenn ich im Thread des mainWindow den PWDialog anzeigen lasse, dann erscheint der versteckt hinter dem Splashscreen, was dem Kunden verständlicherweise nicht gefällt. Notiz am Rande: wenn die App aus dem Visual Studio heraus gestartet wird, gibt es dieses Verhalten nicht! :rolleyes:
-) Wenn ich den Splashscreen zum Owner des PWDialog mache, passt es zwar ansich, aber der Debugger schreit mich jedesmal wegen einem unsicheren Threadübergreifenden Zugriff an (zur Runtime funktioniert das zwar problemlos, weil er da diese Exception nicht wirft, aber jedenfalls ist das definitiv keine Saubere Lösung...).
-) Wenn ich einen Delegate für die ShowDialog Methode mache um den Dialog aus dem Thread des Splashscreens zu starten (Invoke), funktioniert das nicht, denn Delegates funktionieren erst, wenn ein Windowhandle existiert, was natürlich erst NACH dem ShowDialog der Fall ist...
-) wenn ich einen Delegate für meine Methode erstelle, die sich um die Anzeige des Dialogs kümmert, bzw um die Auswertung des "Ergebnisses", dann laufe ich in einen Deadlock sobald eines der GUI Elemente (natürlich wieder per Delegate und Invoke, sprich ein Invoke des Aufrufers zum Aufrufer...) aktiviert/deaktiviert werden soll.

Der einzige Workaround um die Threadproblematik: die Eigenschaft "TopMost" des PWDialogs beim Anzeigen kurzfristig auf True zu setzen. aber dann stiehlt die Applikation den Fokus falls der User nach dem Starten doch noch was anderes tut, eine Eigenschaft die mir persönlich extrem auf die Nerven geht. (Topmost gilt windowsweit, etwas adäquates auf die Applikation begrenzt, gibt es scheinbar nicht...)


Hat jemand dazu irgendwelche Einfälle, wie ich Threadproblematik entweder löse, oder umgehe?


[rant-on] Das ganze Delegate Zeugs ist sowieso ein schlechter Scherz, wieso muss ich eine automatisierbare Aufgabe, die der Compiler für mich tun könnte manuell deklarieren jedes mal?

Warum kann Synchronisation nicht überall so einfach wie in Java sein *seufz* [rant-off]
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz