Из функции потока:
Код: Выделить всё
PostMessage((HWND)appHandleMap.get(L"mainWindow"), WM_THREAD_DONE,
(WPARAM)&THREAD_NAME, (LPARAM)lParam/* Custom Data*/);
return 0;
Код: Выделить всё
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.
}
Код: Выделить всё
WM_DESTROYВ WM_DESTROY я устанавливаю событие Stop, наблюдаемое потоком, и оно перехватывается. Но PostMessage(WM_THREAD_DONE) потока прерывает поток: отладчик показывает, что обработчик WM_THREAD_DONE никогда не достигается, а остальная часть WM_DESTROY никогда не продолжается после этого. Приложение продолжает работать.
Код: Выделить всё
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;
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... age-on-com
Мобильная версия