Problem mit PumpMessage()
-
Hi Leute,
ein kleines Verständnisproblem bzgl. MessagePump. Um während einer Schleife Zugirff auf die GUI zu erhalten nutze ich MessagePump. Damit hab ich zwar Zugriff, aber wenn ich während die Schleife läuft auf den Abbrechen-Button klicke, schließt sich die GUI ABER im Taskmanager ist zu sehen, dass die Anwendung noch läuft.
Weiß jemand woran das liegt und wie man das beheben kann?
Beispielcode:
void CpumpDlg::OnBnClickedOk() { int i = 0; char c[3]; CString cstring; while(i < 50) { sprintf(c, "%d", i); cstring = CString(c)+ _T("\r\n"); m_edit.SetWindowTextW(cstring); i++; Sleep(100); if (!theApp.PumpMessage()) return; } }
void CpumpDlg::OnBnClickedCancel() { CDialogEx::OnCancel(); }
-
Ich würde mal behaupten weil du die MFC versuchst nach deinen gut düngen zu verbiegen. Du arbeitest bei jeden schleifendurchlauf EINE Message von der Message Queue ab, da aber in Windows ALLES über Messages läuft wird zwar der Dialog erstmal invisible geschalten aber eben nicht das ganze Programm beendet dazu müsste deine schleife weiter laufen die aber dann eigentlich schon nen Fehler bringen müsste weil gewisse objekte schon nicht mehr existieren.
Warum setzt du nicht einen timer der aller 100ms auslösst und zählst einfach nen counter den du vorher in der dialogklasse erstellst hast hoch, wenn der 50 erreicht hat, killst du den timer, wenn du abbrechen drückst killst du auch den timer und fertig is dein "schleife". Inline-Denken ist in der MFC nicht wirklich gut.
Spätestens wenn du dann Sachen erledigen willst die größer sind und viel länger dauern, wirst du mit deiner chleifenkonstruktion und PumpMessage nicht weiter kommen, dann wirst du nur über einen neuen Thread und dem Message Handling das sauber umsetzen können.