2010-05-11 2 views
1

У меня есть диалоговое окно с моделями, которое создает поток, и если нажата кнопка отмены в диалоговом окне, устанавливается переменная bCancel, которая периодически проверяет этот поток, а затем сразу же переходит к ее очистить код. Он работает нормально. Я даже могу отправить WM_COMMAND ... ID_CANCEL в диалог из других мест, и он работает одинаково. Но он не работает, когда я пытаюсь отправить ID_CANCEL в диалог из обработчика WM_CLOSE главного окна приложения (т. Е. Пользователь пытается закрыть все приложение вниз, пока этот поток запущен.) Насколько я могу сказать, что-то просто заканчивает поток извне, прежде чем он сможет выполнить свой код очистки. Правильно ли это звучит. Что я могу сделать.завершение нитки изящно при завершении основного приложения

(В обработчике ID_CANCEL диалога есть критический раздел, который я не упоминал, - не уверен, насколько он уместен. (BCancel установлен в этом критическом разделе, а поток выполняет очищающий код в пределах того же критического раздела.)

+0

Обновите свой вопрос и объясните, как вы * знаете *, что очищающий код не выполняется. –

+0

Ну, я ввел в него отладочные утверждения. В частности, хотя каталог не удалялся, который удаляется в конце потока и удаляется в каждом другом экземпляре, который ID_CANCEL отправляется в диалог. Я пробовал WaitForSingleObject в обработчике диалога ID_CANCEL (как было предложено Крисом ниже), и нить не заканчивается, если я так жду, потому что сам поток устанавливает управляющие значения диалогового окна в своем коде завершения. Возможно, мне нужно запустить WaitForSingleObject в обработчике WM_CLOSE главного окна приложения (а не в диалоговом коде). – Mark

ответ

1

Не то, чтобы кому-то все еще интересно, но в основном приложении WM_CLOSE обработчик я установил bCloseApp = TRUE, а затем отправлю ID_CANCE L в диалоговом окне, а затем проверьте, активен ли поток. Если это я, я возвращаю 0 (таким образом, минуя стандартную DestroyWindow WM_CLOSE.) Затем в коде выхода потока I PostMessage (... WM_CLOSE ...) в главное окно приложения, если bCloseApp == TRUE.

Перед тем, как приступить к реализации вышеизложенного, я обнаружил, что в обработчике WM_CLOSE основного приложения нить, о которой идет речь, автоматически приостанавливается по какой-либо причине (что меня удивило), и это было осложняющим фактором, поскольку я не мог дождаться, когда поток завершаться в обработчике WM_CLOSE.

0

После установки bCancel потока ваш код диалога должен дождаться, когда дескриптор потока получит сигнал (таким образом, будет уничтожен), поэтому вы можете использовать одну из функций wait ### в дескрипторе потока (со значением времени ожидания курс), поэтому приложение будет ждать небольшой бит для вашей очистки потока, чтобы получить вызов.

+0

Предположим, вы имеете в виду WaitForSingleObject, хотя никогда не использовали его раньше. Используемые критические разделы и мьютексы для разных вещей. – Mark

+1

WaitForSingleObject, да! –

+0

Ну, так или иначе, он еще не работает для меня. – Mark

Смежные вопросы