У меня есть собственный VC Win32 ++ приложение это после ввода WinMain()
запускает отдельный поток, затем делает некоторое полезное задание, в то время как тот другой поток работает, тогда просто выходит WinMain()
- другой поток явно не останавливается.
Это сообщение в блоге говорит, что приложение.NET не завершится в этом случае, так как другой поток все еще работает. То же относится к собственным приложениям Win32?
Я должен остановить все потоки до выхода?
Да, иначе приложение может зависнуть. Я рекомендую прочитать отличные сообщения в блоге Раймонда Чена по этой теме:
Не хватает: Для завершения родного Win32-процесса необходимо выполнить одно из двух условий:
(Первое условие на самом деле то же самое, что и второе: ExitProcess и TerminateProcess, в рамках своей очистки, оба вызывают TerminateThread для каждого потока в процессе).
Время выполнения c налагает различные условия: Для того, чтобы C/C++ приложение завершилось, вы должны либо:
вызов exit() или возврат из main() приводит к тому, что c-runtime вызывает ExitProcess(). Таким образом, приложения на c и c++ выходят без очистки своих потоков. Лично я считаю, что это плохо.
Однако, нетривиальные Win32-процессы никогда не могут закончиться, потому что многие совершенно разумные подсистемы Win32 создают рабочие потоки. winsock, ole и т.д. И не обеспечивают никакого способа, чтобы вызвать эти потоки, чтобы спонтанно закрыть.
Я думаю, вы можете сначала закрыть все свои окна (чтобы пользователь не видел ваше приложение), а затем установить флаг для выхода, ваш поток должен периодически проверять этот флаг, и после того, как он будет установлен, поток должен вернуться.
после установки флага ваш основной поток может вызвать :: WaitForSingleObject () или :: WaitForMultipleObject () на некоторое время (скажем, три секунды), если поток (ы) не вернутся, просто уничтожьте их с помощью :: TerminateThread ().
Нет, когда WinMain вернется, процесс будет прерван, а это означает, что все порожденные процессом потоки должны быть прерваны, хотя они могут и не быть закрыты грациозно.
Однако, возможно, что основной поток будет завершен во время работы других потоков, в результате чего приложение все еще будет запущено . Если в WinMain вызывается ExitThread
(а не exit
или ExitProcess
), и выполняются потоки (в конечном итоге созданные первичным потоком), то можно наблюдать такое поведение. Тем не менее, просто вернуться в WinMain вызовет ExitProcess
, а это означает, что все потоки должны быть завершены.
Поправьте меня, если это неправильно.