PostMessage und GetMessage - Noob-Frage
-
Hallo Forum,
ich möchte in meiner Anwendung darauf warten, daß eine Thread-Funktion etwas erledigt hat, was sie per Message mitteilen soll.
wParam und lParam interessieren in diesem Fall nicht, allein das Ankommen der Nachricht ist von Interesse.
Hier ein Stück fehlerhaften Codes zur Illustration:
// in StdAfx.h: #define BINGO (WM_USER+17) // in CTestDlg.cpp: void CTestDlg::OnTimer(UINT nIDEvent) { // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen KillTimer(1); MSG msg; AfxBeginThread(MyThread, this); msg.message=0; // Warte auf ein Hallo von DoStuff while(msg.message!=BINGO) GetMessage(&msg, NULL, 0, 0); // weiter geht´s ... CDialog::OnTimer(nIDEvent); } UINT CTestDlg::MyThread(LPVOID p) { CTestDlg* app=(CTestDlg*) p; app->DoStuff(app); return 28; } void CTestDlg::DoStuff(LPVOID p) { CTestDlg* app=(CTestDlg*) p; // do some stuff ... ::PostMessage(app->m_hWnd, HUHU, 0, 0); // do some more stuff ... }Wie muss ich die Zeilen mit PostMessage und GetMessage verändern, damit das ganze funktioniert?
Dankbar für alle Anregungen,
Kyer
-
1. WM_APP statt WM_USER verwenden. Dialoge haben ihre eigenen WM_USER Nachrichten.
2. Du frisst die Nachrichten nur, durch GetMessage. Ohne TranslateMessage/Dispatch Message werden diese nicht ausgeliefert und kommen nicht an.
3. Warum startest Du den Thread im Timer?
4. Besser ist es einfach den normalen Dialog per EnnableWindow(false) zu blockieren und einfach auf das eintrefen der Nachricht zu warten indem man retunriert und die Dialog-Message-Schelife die Arbeit machen lässt.
Nicht vergessen die Nachricht auch in die Message-Map einzutragen undzu behandeln.
5. Bei diesem Verfahren, das Du anwendest verstehe ich gar nicht warum Du einen Thread brauchst.
-
Danke für Deine Antwort.
-
-
- Erledigt. Das ändert aber erstmal nichts, offensichtlich wegen 4)
-
-
Das ist nur aus einem Testprogramm rausgezogen. Da findet es zufällig im Timer statt.
-
Wie sieht denn ein Eintrag in der Message-Map aus, der die Nachricht nicht mit einer Funktion verknüpft?
Den Dialog zu blockieren hilft mir nicht, siehe 5) -
Ich habe nur ein Gerippe ausgeschnitten, das den Ablauf illustrieren soll. In der eigentlichen Anwendung wird ein Bild auf dem Bildschirm bewegt, während der Thread ein neues Bild im Hintergrund aufbaut. Ist das Bild fertig, soll das Hauptprogramm per Nachricht darüber informiert werden. Das ganze wiederholt sich innerhalb des Threads, also nützt es nicht, die Beendigung des Threads abzuwarten.
Ich hoffe, eine kurze Antwort zu 4) wird mir weiterhelfen. Danke im Voraus,
Kyer
-