Win32 C++: WM_DESTROY kann einen Thread nicht beenden, der bei Abschluss eine benutzerdefinierte WM_-Nachricht sendetC++

Programme in C++. Entwicklerforum
Anonymous
 Win32 C++: WM_DESTROY kann einen Thread nicht beenden, der bei Abschluss eine benutzerdefinierte WM_-Nachricht sendet

Post by Anonymous »

Ich habe einen Thread, der nach Abschluss eine benutzerdefinierte WM_THREAD_DONE-Nachricht sendet. Wenn ein Stop-Ereignis festgelegt ist, wird es normal beendet und diese Nachricht gesendet. Die Nachricht benötigt einige wParam/lParam-Parameter, die bestimmen, wie der zugewiesene Speicher bereinigt wird.
Aus der Thread-Funktion:

Code: Select all

PostMessage((HWND)appHandleMap.get(L"mainWindow"), WM_THREAD_DONE,
(WPARAM)&THREAD_NAME, (LPARAM)lParam/* Custom Data*/);
return 0;
Im WM_THREAD_DONE-Handler des Hauptfensters:

Code: Select all

case WM_THREAD_DONE:
{
// ...
std::wstring* threadName = (std::wstring*)wParam;
THREAD_DATA* threadData = (THREAD_DATA*)lParam;
// Close Thread Handle in Handle Map and delete
appHandleMap.closeHandleObjectAndRemove(threadName);
// Clean up any allocated memory
delete threadData;
// etc.
}
Alles funktioniert. Aber jetzt muss ich das Schließen jedes laufenden Threads erzwingen, wenn die Anwendung beendet wird (

Code: Select all

WM_DESTROY
).
In WM_DESTROY habe ich das Stop-Ereignis festgelegt, das vom Thread beobachtet wird, und es wird abgefangen. Aber die PostMessage(WM_THREAD_DONE) des Threads unterbricht den Fluss: Der Debugger zeigt an, dass der WM_THREAD_DONE-Handler nie erreicht wird und der Rest von WM_DESTROY danach nie fortgesetzt wird. Die Anwendung läuft weiter.

Code: Select all

case WM_DESTROY:
{
// Set Stop Event for thread
HANDLE hStopEvent = ..;
SetEvent(hStopEvent); // this works, and is successfully detected by thread

while (appHandleMap.getKeysStartingWith(L"thread").size() > 0) {
// Do nothing, give it some time to close
// We proceed when the thread is no longer in the handle Map
}

//.. etc. other Destroy code
appHandleMap.clear();
PostQuitMessage(0);
break;
}
Es liegen keine Fehler vor. Aber im Debugger stoppt der gesamte Ablauf einfach, nachdem der Thread seine WM_THREAD_DONE-Nachricht gesendet hat (aus WM_DESTROY heraus) und die Anwendung läuft weiter. Weder WM_THREAD_DONE noch der Rest von WM_DESTROY werden behandelt (um seine PostQuitMessage(0) usw. auszuführen). Ich glaube, es liegt eine Verwechslung vor, wenn eine Nachricht aus einem anderen Nachrichtenhandler für dasselbe Fenster gepostet wird.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post