завершающий поток изящно при завершении основного приложения - PullRequest
1 голос
/ 12 мая 2010

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

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

Ответы [ 2 ]

1 голос
/ 12 мая 2010

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

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

0 голосов
/ 12 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...