none
Programm hängt in GetMessage bei Programmende RRS feed

  • Frage

  • Hi,

    ich habe ein "normales" MFC-Programm, ohne COM o.ä.

    Bei Programmende verschwindet das Programmfenster, das Programm verbleibt im Taskmanager,
    ein Break im Debugger führt zu AfxInternalPumpMessage/GetMessage.

    Ich habe mal den Weg in CMainFrame::OnClose verfolgt. Es wird normal
    PostQuitMessage über CWnd::OnNcDestroy meines Mainframes aufgerufen.

    Dann habe ich folgendes eingebaut:

    CMainFrame::OnClose()
    {
      __super::OnClose();
      MSG msg;
      ASSERT(PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_NOREMOVE));
      ASSERT(!::GetMessage(&msg, NULL, NULL, NULL));
    }
    
      

    Mein WM_QUIT ist wirklich vorhanden und GetMessage liefert FALSE.

    Trotzdem bleibt mein Programm in der Message-Pumpe hängen.
    Was könnte die Ursache sein?
    Ich vermute mal, jemand isst mein WM_QUIT, aber wer und wie bekomme ich es heraus?

    Tschüß, Holger.

    Mittwoch, 15. Januar 2014 14:38

Antworten

  • ok selber gefunden.

    "Einfach" überall wo GetMessage/PeekMessage verwendet wird ein conditional breakpoint
    der nach OnClose feuert.

    Und siehe da, aus einer unerwarteten Ecke heraus wurde meine Funktion WaitWindow aufgerufen

    while(::PeekMessage(&Msg, pWnd->GetSafeHwnd(), NULL, NULL, PM_REMOVE )==TRUE)
    {
      ::TranslateMessage(&Msg);
      ::DispatchMessage(&Msg);
    }	
    

    und der hat mein WM_QUIT gegessen.

    Die Fehlerbehebung war natürlich, dass diese Aufrufe nach einem Close nichts mehr zu suchen haben
    und als Angsthasenbonus natürlich eine Prüfung auf Msg.message==WM_QUIT eingebaut der
    einfach noch mal AfxPostQuitMessage aufruft.

    Tschüß, Holger.

    Mittwoch, 15. Januar 2014 16:06