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 schlau 😉 hat 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 == 4bytes

    Erst 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


Anmelden zum Antworten