Die Anwendung "Beschäftigt" führt unter Windows 7 - WM_UPDATE zu einem falschen Status "Nicht reagiert"

8

Während langer Operationen zeigt unsere C ++ Win32-Anwendung einen modalen Status-Dialog mit einer Prozessleiste, die alle paar Sekunden unregelmäßig aktualisiert wird. Ab Windows 7 haben wir festgestellt, dass Windows ziemlich bald eine Meldung "scheint zu hängen ..." anzeigt und / oder hängt "Nicht reagiert" an unsere Titelleiste an.

Wir haben herausgefunden, dass der Prozessdialog Nachrichten verarbeiten muss, um dies zu vermeiden. Genauer gesagt scheint Windows 7 ständig WM_UPDATE-Nachrichten zu senden, um zu überprüfen, ob unser Programm am Leben ist. Wir hatten zuvor alle nicht benötigten Nachrichten in diesem Dialog deaktiviert, da Profilläufe zeigen, dass sie stark verlangsamt waren.

Aber obwohl wir gedacht haben, das Problem zu beheben, melden die Benutzer wieder solche Probleme: Windows zeigt "scheint zu hängen ..." und / oder hängt "Nicht reagiert" an unsere Titelleiste an, obwohl wir alle Ereignisse alle paar behandeln Sekunden.

Fragen:

  • Gibt es Dokumentation über diese Verhaltensänderung in Windows 7 (oder Windows Vista)? Wir haben keine gefunden. Wir haben auch eine Reihe anderer Änderungen des Nachrichtenverhaltens festgestellt.

  • Gibt es möglicherweise eine Möglichkeit, alle solchen "is alive" Checks von Windows zu deaktivieren? Unsere Anwendung ist ziemlich lebendig und Prozesse können ziemlich lange dauern.

BEARBEITEN: Um genauer zu sein - was wir nur alle paar Sekunden tun, ist die Meldung pump PeekMessage / TranslateMessage / DispatchMessage .

Da dies ein recht altes Legacy-Programm ist, ist die Verwendung eines separaten Worker-Threads in naher Zukunft nicht möglich. Das tun wir natürlich für neuen Code. Bitte beachten Sie auch, dass mein Hauptpunkt ist, dass sich dieses Verhalten mit Windows Vista / Windows 7 definitiv geändert hat. Ich habe keine Dokumentation darüber gefunden.

    
RED SOFT ADAIR 09.08.2011, 13:56
quelle

1 Antwort

18

Nun, die direkte Antwort auf Ihre Frage ist, dass Sie % co_de aufrufen können % .

Es wäre jedoch viel besser, die Wurzel des Problems anzusprechen, als die Symptome zu unterdrücken. Ihr Fenster wird gesperrt, weil Sie die Nachrichtenwarteschlange nicht pumpen. Sie tun das nicht aus dem bewundernswerten Grund, dass Ihre Anwendung mit Arbeit beschäftigt ist. Der akzeptierte Weg, Arbeit zu erledigen und die Warteschlange in Schwung zu halten, besteht darin, die Arbeit in einem separaten Thread zu erledigen.

    
David Heffernan 09.08.2011, 14:04
quelle