PostMessage-Durcheinander



  • Hallo zusammen

    In meiner Applikation wird ein einfacher Worker-Thread gestartet.
    Als Rückmeldung dass er gestartet wurde versende ich mit PostMessage eine Nachricht welche in der Message-Map einer Funktion zugeordnet ist die mir eine MessageBox ausgibt. Das gleiche habe ich für das Thread-Ende ebenfalls noch eingefügt. Der Thread sieht wie folgt aus:

    UINT KommunikationsThread(LPVOID pParam)
    {
    	::PostMessage((HWND)pParam, WM_THREAD_IN_BACKGROUND, 0, 0);
    	::PostMessage((HWND) pParam, WM_THREAD_FINISH, 0, 0);
    	return 0;
    }
    

    Das Problem ist nun, dass bei jeder Ausführung der Applikation und des Threads zuerst die Message-Box für das Thread-Ende erscheint, und erst dann die Box für den Thread-Start. Nach msdn fügt ein PostMessage die Nachricht in eine Nachrichten-Queue.
    Also, wie kann das zu Stande kommen?
    Oder wie kann ich das Problem allenfalls umgehen?

    Vielen Dank,
    ein etwas verwirrter Ratio


  • Mod

    Du bist ein Witzbold...

    Die Messages kommen in der Reihe. Nur passiert folgendes:
    1. Message über WM_THREAD_IN_BACKGROUND kommt an. MessageBox erscheint. Mit der MessageBox wird un die Message loop wieder aktiv.
    also.
    2. Die Messagebox über das Ende erscheint über der der Start-Info.

    Schieb mal die Messagebox fürt das Ende beiseite. Was siehst Du? 🕶

    Wenn man eine Messageloop neu startet, durch einen Dialog oder durch eine MessageBox muss man sich nicht wundern, dass so was passiert.



  • Ich schiebe die MessageBox für das Thread-Ende zur Seite und was sehe ich?

    Nichts!

    Wähle ich OK so verschwindet die Thread-Ende-MessageBox und die Thread-Start-MessageBox erscheint an gewohnter Stelle.

    Gibt es noch eine weitere Erklärungs-Möglichkeit?
    Ich stehe momentan voll auf dem Schlauch...!

    Viele Grüsse, Ratio


  • Mod

    Dann zeige mal Deinen Code für die Handler.



  • Meine aktuellen Handler sind momentan soweit gekürzt dass bloss eine MessageBox ausgegeben wird. Ich könnte sie, falls trotzdem von Interesse, erst Donnerstags posten.

    Folgendes ist mir noch aufgefallen:

    Füge ich folgenden Hardcode zwischen den beiden PostMessages ein, so werden die Boxen in der korrekten Reihenfolge angezeigt.

    for(int i = 0; i < 10000000; i++);
    

    😕 Grüsse Ratio 😕



  • Is doch ganz einfach, du hast ein Multithread-System und du kannst net sagen was zu erst läuft (deswegen is auch thread-syncronisation von nöten). Wenn du wissen willst was los is frag das handle mit entsprechenden Funktionen ab, alles andere is humbug. Des weiteren lass solche for Schleifen die gehen früher oder später nach hinten los, wenn du warten willst, oder mußt dann benutze sleep(), alles andere is Destruktive.

    meine meinung zu dem ganzen

    gruß



  • Multith'eading in de' selben Message-Queue? Das wä'e füh'wah' ein Kunststück!


  • Mod

    @Ratio:
    OK jetzt ist mir klar was passiert. Es verhält sich in etwa so wie ich schon vermutete:

    Die Messages kommen in der Reihe. Nur passiert folgendes:
    1. Message über WM_THREAD_IN_BACKGROUND kommt an.
    2. MessageBox wird vorbereitet und erzeugt die MessageLoop läuft an.
    Wichtig: Angezeigt wird die Box, wie jeder Dialog auch erst nach Ablauf von WM_INITDIALOG.
    3. Weil die Message Loop anläuft wird jetzt natürlich als nächstes die bereits wartende End-Nachricht aus der Queue gezogen.
    4. Die zweite Nachricht wird ausgeliefert und zeigt nun die zweite MessageBox an.

    Schau in den Callstack:
    Du wirst sehen, dass der erste Handler korrekt angelaufen wurde 🕶 und Du auch den Aufruf der ersten MessageBox Funktion siehst.

    Deshalb führt en Verzögern der Nachrichten auch das Anzeigen beider Boxen "übereinander" wenn Du lange genug wartest. Bau mal einfach einen Sleep(1000) ein!

    @CTecS: Es ist garantiert, dass die Messages in der korrekten Folge ausgeliefert werden!
    Hier ist nichts von Synchronistation nötig, denn das macht ja gerade PostMessage!



  • @Martin

    Danke für deine Erklärungen. Hat mein MFC-Verständnis wieder etwas vorangebracht!

    Viele Grüsse, Ratio


  • Mod

    Ratio schrieb:

    @Martin

    Danke für deine Erklärungen. Hat mein MFC-Verständnis wieder etwas vorangebracht!

    Hat mit der MFC nichts zu tun 😉 Dieser Effekt würde auch bei einem puren Windows API Programm entstehen.

    Aber es ist wirklich ein interessantes Problem, dem ich vermutlich mal einen Blog Artikel widmen werde.


Anmelden zum Antworten