Unklarheiten bei PostThreadMessage(...)
-
Hallo,
ich würde gerne in einer fensterlosen DLL Nachrichten zwischen zwei Threads austauschen. Nachdem ich mich etwas damit auseinandergesetzt habe und ich feststellen musste dass, das versenden von Nachrichten auf dem "üblichen" Weg nur an Fensterklassen möglich ist bin ich auf
BOOL PostThreadMessage( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam );
gestossen.
Nur wie fange ich nun Nachrichten ab die ich per PostThreadMessage(...) versende? Einfach mit einer Schleife in DllMain?
// DLL-Einstiegspunkt extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { hInstance; while(GetMessage(&msg, NULL, WM_USER, WM_USER)) { //Mache was mit den Nachrichten } return _AtlModule.DllMain(dwReason, lpReserved); }
TranslateMessage(&msg) & DispatchMessage(&msg) kann ich mir ja sparen da ich keinlei Fenster habe. Könnte ich die die Nachrichtenschleife auch in die Klasse einbauen wo ich die Nachricht brauche? Bzw. bei eintreffen einer Nachricht das ganze an eine ClassProc (o.s.ä.) weiterleiten wo ich die Nachricht dan verarbeite?
Und in der MSDN stand zu PostThreadMessage unter Remarks noch das man sicherstellen solle ob auch eine message queue erstellt wurde. Und falls nicht irgendwie mit WaitForSingelObject(...) darauf warten.
Irgendwie werde ich aus dem ganzen nicht so wirklich schlauhat jemand vielleicht ein kleines Code-Beispiel für mich?
Grüsse und vielen Dank
Spontex
-
blöde gegenfrage:
so wie aussieht möchtest du ne user nachricht senden, allerdings was möchtest du den als lParam übergeben? lParam == 4bytes
wieso exportierst du nicht die threadfunktion und greifst dann darauf zu.offtopic
Spontex schrieb:
[cpp]
while(GetMassage(&msg, NULL, WM_USER, WM_USER))
[/cpp]ich auch will
-
miller_m schrieb:
blöde gegenfrage:
so wie aussieht möchtest du ne user nachricht senden, allerdings was möchtest du den als lParam übergeben? lParam == 4bytesErst mal gar nichts, ich möchte nur erfahren wann eine bestimmte user nachricht eingegangen ist. Später wenn das ganze funktioniert sende ich vielleicht (in einem anderm Fall der diese Frage hier nicht ausgelöst hat) einen Integer mit der einen Index darstellt.
miller_m schrieb:
wieso exportierst du nicht die threadfunktion und greifst dann darauf zu.
Kann ich leider nicht da der Thread "nicht mir gehört". Ich würde die Funktion PostThreadMessage(...) in einem Callback aufrufen um aus dem Thread herauszukommen und das ganze asynchron abgearbeitet werden kann.
miller_m schrieb:
ich auch will
Ja das wäre jetzt nicht schlecht
-
In der MSDN ist ein Beispiel drin ...
Hier die Kurzfassung:
Empfangs-Thread mit Message-Queue erstellen:
... // create an event for the thread's queue completition hEvent = CreateEvent (NULL, false, true, QEVENT); hThread = CreateThread ( NULL, // no security attributes 0, // use default stack size Receive_Thread, // thread function &stThread, // argument to thread function 0, // use default creation flags &idThread); // returns the thread identifier // wait for queue completition DWORD dwState = WaitForSingleObject (hEvent, 100); // 100 ms warten ...
Empfangs-Thread:
DWORD WINAPI Receive_Thread (LPVOID lpParam) { ... // create a queue for the thread PeekMessage ((LPMSG)&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); // sent event after queue creation back to the threads creator SetEvent (hEvent); // get messages by message from threads local queue while ((bRet = GetMessage (&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // handle the error and possibly exit return 1; // error! } else { // a valid message is received switch (msg.message) { case QS_TIMER: // a WM_TIMER message is in the queue (SetTimer) .... // tu' irgendwas (lParam, wParam auswerten ...) break; default: .... // tu' irgendwas break; } // end of: switch (msg.message) } // end of: if (bRet == -1) else ... } // end of: while((bRet = GetMessage(... ...
Aufruf von PostThreadMessage () von irgendwo:
... BOOL bRet = PostThreadMessage (idThread, Msg, wParam, lParam); ...
Blackbird