Postthreadmessage() und Getmessage() -> Warteschlange?



  • Hallo,

    ich versuche vom Hauptprogramm aus einen Workerthread mittels Postthreadmessage() zu wecken. z.B. weil neue Daten vorliegen und der Workerthread diese doch bitte abholen möge.

    Der Workerthread ist normalerweise mit Getmessage() in einer blockierenden Warteposition ausser er arbeitet gerade Daten ab.

    Und darin liegt nun mein Problem.
    Ist der Worker gerade am arbeiten und erhält in dieser Zeit mittels Postthreadmessage() eine Nachricht, wird das nächste auftauchen von Getmessage() wieder blockierend, obwohl nach meinem Verständnis nach eine Nachricht in der Queue ist und das Getmessage() eigentlich unblockierend diese abholt.

    Kurz gesagt:
    Ist Worker in Getmessage() blockierend wacht er durch postthreadmessage() auf
    Ist Worker beschäftigt und erhält indes eine Message ist er beim nächsten Aufruf von Getmessage wieder im Tiefschlaf, obwohl was abzurufen wäre.

    Was mache ich falsch?

    OS: WinXP
    C++: Mingw



  • Hi

    Statt GetMessage kannst du auch PeekMessage verwenden, das blockiert nicht. Es gibt dir zurück, ob eine Nachricht da war. Wenn eine da war, hat es sie in deiner MSG-Variable abgelegt, sonst passiert nichts.
    Und du musst als HWND-Parameter NULL angeben, sowohl bei GetMessage als auch bei PeekMessage.



  • Hallo und danke für die Antwort.
    Leider muss ich dann wohl eine 100%-CPU-Time Warteschleife mit Peekmessage machen...

    Mir gefiel ja bei Getmessage, dass es blockierend ist.

    bei HWND hab ich natürlich NULL. 🙂

    DWORD WINAPI workerthread(PVOID pParam)
    
    {
    	MSG msg;
    	newclientdata * MyData;
    	MyData=(newclientdata*)pParam;
    	cout<<MyData->kb->thm->data(MyData->id);
    	do
    	{
    		cout<<"Thread waiting"<<endl;
    		GetMessage ( &msg , NULL , 0, 0);
    	} while (MyData->kb->thm->fetch(MyData->id)!="Start");
            cout<<"never reach this line"<<endl;
    


  • Von welchem Typ ist "(MyData->kb->thm->fetch(MyData->id)"? Wenn es ein const char* ist, mach lieber strcmp oder stricmp oder strncmp oder strnicmp 🙂



  • Badestrand schrieb:

    Von welchem Typ ist "(MyData->kb->thm->fetch(MyData->id)"? Wenn es ein const char* ist, mach lieber strcmp oder stricmp oder strncmp oder strnicmp 🙂

    Musst du sogar, du vergleichst hier:

    MyData->kb->thm->fetch(MyData->id)!="Start"
    

    nur Speicheradressen ➡ ⚠ .


Log in to reply