2009-05-10 4 views
1

Ich arbeite an einem Windows-Programm, das vollständig single-threaded ist und keinen Schutz für eine Datenstruktur hat. Das Programm verwendet jedoch die DirectShow-API, die ihr eigenes internes Nachrichten-Dispatching, zum Beispiel IVideoWindow :: put_Visible, öffnet. Die Ereignisbehandlungsfunktion, die die IVideoWindow :: put_Visible-Methode aufruft, gibt anderen Ereignisbehandlungsfunktionen die Chance, ihre Daten zu ruinieren.Deaktivieren des Nachrichtenversands innerhalb eines Handlers

Gibt es trotzdem einen solchen Nachrichtenversand innerhalb einer API zu verhindern?

Antwort

0

Die Frage ist mir etwas unklar. Sprechen Sie über eine API, die intern in eine modale Nachrichtenschleife eintritt? Stellt dies für Sie ein Re-Entrance-Problem dar? Wenn das der Fall ist, dann gibt es wahrscheinlich bessere Möglichkeiten, um Ihr Problem zu lösen. Wenn eine API eine modale Schleife eingibt, dann gibt es zweifellos einen guten Grund, und Sie sollten es erlauben, dies zu tun. (In Ihrem Fall würde ich vermuten, dass DirectShow intern mit einem anderen COM-Objekt kommuniziert.) Wenn es korrekt geschrieben ist, sendet eine modale Schleife weiterhin Nachrichten an die anderen Fenster desselben Threads.

In jedem Fall, wenn Sie das wirklich tun möchte, ist hier, wie:

PostQuitMessage(0); // Signal quit to force the upcoming loop to exit 
APIFunc(); // Enters modal loop internally 
MSG msg; 
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE); // Eat the next WM_QUIT 

Der letzte Schritt ist wichtig. Wenn eine modale Schleife aufgrund einer WM_QUIT-Nachricht beendet wird, muss sie nach dem Beenden eine eigene Beendigungsnachricht senden (damit die App die Aufgabe beenden kann). Wenn Sie es nicht essen, wird Ihre Anwendung beendet.