Win32 C++: WM_DESTROY не может завершить поток, который по завершении отправляет специальное сообщение WM_C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Win32 C++: WM_DESTROY не может завершить поток, который по завершении отправляет специальное сообщение WM_

Сообщение Anonymous »

У меня есть поток, который по завершении отправляет специальное сообщение WM_THREAD_DONE. Если установлено событие Stop, оно завершится нормально и отправит это сообщение. Сообщение принимает некоторые параметры wParam/lParam, которые определяют, как очистить выделенную память.
Из функции потока:

Код: Выделить всё

PostMessage((HWND)appHandleMap.get(L"mainWindow"), WM_THREAD_DONE,
(WPARAM)&THREAD_NAME, (LPARAM)lParam/* Custom Data*/);
return 0;
В обработчике WM_THREAD_DONE главного окна:

Код: Выделить всё

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;
}
Ошибок нет. Но в отладчике после того, как поток отправляет сообщение WM_THREAD_DONE (из WM_DESTROY), весь поток просто останавливается, и приложение продолжает работать. Ни WM_THREAD_DONE, ни остальная часть WM_DESTROY не обрабатываются (для выполнения PostQuitMessage(0) и т. д.). Я думаю, что произошла какая-то путаница с сообщением, отправленным из другого обработчика сообщений для того же окна.

Подробнее здесь: https://stackoverflow.com/questions/797 ... age-on-com
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»