OnInitDialog() nur später?
-
Erzeuge den Dialog nicht Modal.
Führe Deine Berechnung durch und rufe ab und Zu UpdateWindow für den Dialog auf.
-
Ok, ich bin blind...
CreateEx() gibts für etwa alles, nur nicht bei CDialog.
Auch bei google hab ich nix gefunden...
Was ist überhaupt der Unterschied?Was ich gegen WS_EX_TOPMOST habe? Damit lässt sich der Dialog auch von irgendwelchen anderen Anwendungen nicht mehr überdecken. Das ist etwas übers Ziel herausgeschossen.
Ich machs mit EnableWindow(). Das ist eine gute Idee...
Auch wenn ich's jetzt nicht mehr brauche, es interessiert mich immernoch, wie die Nachricht heisst, die _nach_ OnInitDialog() versendet wird...
nochmals vielen Danke
Lord_Senna
-
Hi,
meines wissens nach, gibt es keine gesonderte Nachricht, die nach OnInitDialog
kommt. Du kannst Dir aber selber eine in OnInitDialog Posten (nicht Senden!).In Deiner Nachrichtenfunktion prüfst Du dann, ob Dein Dialog schon sichtbar ist.
Wenn nicht, postest Du Dir die Nachricht noch einmal zu.Meiner Meinung nach, ist es aber besser, wenn Du in OnInitDialog einen
Workerthread startest, der die Berechnungen durchführt, und eine Nachricht
an den Dialog sendet, um die Progressbar zu aktualisieren.
Dadurch bleibt der modale Dialog bedienbar.Gruß
Frank
-
WM_SHOWINDOW
Kommt wenn ein Fenster angezeigt oder ausgeblendet wird.
Edit:
Stimmt habe mich verschrieben. Danke.
-
Es heißt korrekt: WM_SHOWWINDOW
-
Erstmal bedanke ich mich für alle Antworten.
Ich habe so einen Mix aus allem gemacht...
Ich starte den LadeDialog mit Create() (da CreateEx() immernoch nicht aufgetaucht ist) und disable dann den Hauptdialog.
Darauf starte ich einen Thread der die Berechnungen ausführt.So viel zur Theorie...
Jedoch bei jedem Aufruf von UpdateData(...) (im Workerthread) stürzt mir das ganze Ding ab.
Ist es nicht möglich UpdateData(...) aus einem Workerthread aus aufzurufen?
Oder muss man etwas spezielles "machen"?nochmal danke,
Lord_Senna
-
Nein! UpdateData sollte aus einem Workerthread nicht aufgerufen werden.
Sende eine eigene Windows Nachricht per PostMessage um den Dialog über das Ergebnis zu informieren.
-
Es sollte nicht nur nicht aufgerufen werden.
Es funktioniert nicht.
Jochen hat dies in einem Thread mal erklärt wieso.
-
Ok, dann halt über den Umweg mit der Nachricht...
Wo wir wieder bei ein paar Fragen angelangt sind:
-
Warum darf man UpdateData(...) nicht aus einem Workerthread aus aufrufen? (ja, ich habe gesucht, es aber nicht gefunden.
-
Wie fange ich eine Benutzerdefinierte Nachricht (bei MFC) ab? Wie heisst das Dingens, das man bei MessageMap eintragen muss, damit man auf die eigene Nachricht reagieren kann (das Teil heisst Makro, oder?)?
tausend Dank
Lord_Senna
-
-
Lord_Senna schrieb:
- Warum darf man UpdateData(...) nicht aus einem Workerthread aus aufrufen? (ja, ich habe gesucht, es aber nicht gefunden.
Ganz so hart das es nicht geht wüsste ich nicht. Manches geht... leider. Deshlab denkt ja jeder man könnte es immer machen.
1. Weil CWnd Objekte Thread afine sind und diese Objekte nicht über Threadgrenzen hinweg verwendet werden sollten! Manche Funktionen gehen, die nur auf einen simplen Zugriff auf m_hWnd machen, oder einfache Membervariablen verwenden. Allerdings eben nicht alles.
2. UpdateWindowe löst im Normalfall eine gaze Welle von Windows Nachrichten aus, die nun alle mit dem Mainthread ausgetauscht werden müssen... das ist extrem uneffektiv und lahm.Lord_Senna schrieb:
- Wie fange ich eine Benutzerdefinierte Nachricht (bei MFC) ab? Wie heisst das Dingens, das man bei MessageMap eintragen muss, damit man auf die eigene Nachricht reagieren kann (das Teil heisst Makro, oder?)?
#define WM_MYMESSAGE (WM_APP+1)
ON_MESSAGE(...)
LRESULT CMyDialog::OnMyMessage(WPARAm wParam, LPARAM lParam)