Действительно ли необходимо явно остановить все потоки до выхода из приложения Win32?

У меня есть собственный VC Win32 ++ приложение это после ввода WinMain() запускает отдельный поток, затем делает некоторое полезное задание, в то время как тот другой поток работает, тогда просто выходит WinMain() - другой поток явно не останавливается.

Это сообщение в блоге говорит, что приложение.NET не завершится в этом случае, так как другой поток все еще работает. То же относится к собственным приложениям Win32?

Я должен остановить все потоки до выхода?

10
задан sharptooth 4 February 2010 в 06:13
поделиться

5 ответов

Не хватает: Для завершения родного Win32-процесса необходимо выполнить одно из двух условий:

  • Кто-то вызывает ExitProcess или TerminateProcess.
  • Все потоки выходят (возвращаясь из своего ThreadProc (включая WinMainEntryPoint, который является первым потоком, созданным windows)), закрываются (вызывая ExitThread) или завершаются (кто-то вызывает TerminateThread).

(Первое условие на самом деле то же самое, что и второе: ExitProcess и TerminateProcess, в рамках своей очистки, оба вызывают TerminateThread для каждого потока в процессе).

Время выполнения c налагает различные условия: Для того, чтобы C/C++ приложение завершилось, вы должны либо:

  • вернуться из main (или WinMain). Вызов
  • exit()

вызов exit() или возврат из main() приводит к тому, что c-runtime вызывает ExitProcess(). Таким образом, приложения на c и c++ выходят без очистки своих потоков. Лично я считаю, что это плохо.

Однако, нетривиальные Win32-процессы никогда не могут закончиться, потому что многие совершенно разумные подсистемы Win32 создают рабочие потоки. winsock, ole и т.д. И не обеспечивают никакого способа, чтобы вызвать эти потоки, чтобы спонтанно закрыть.

3
ответ дан 4 December 2019 в 00:24
поделиться

короткий ответ: да

-1
ответ дан 4 December 2019 в 00:24
поделиться

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

после установки флага ваш основной поток может вызвать :: WaitForSingleObject () или :: WaitForMultipleObject () на некоторое время (скажем, три секунды), если поток (ы) не вернутся, просто уничтожьте их с помощью :: TerminateThread ().

0
ответ дан 4 December 2019 в 00:24
поделиться

Нет, когда WinMain вернется, процесс будет прерван, а это означает, что все порожденные процессом потоки должны быть прерваны, хотя они могут и не быть закрыты грациозно.

Однако, возможно, что основной поток будет завершен во время работы других потоков, в результате чего приложение все еще будет запущено . Если в WinMain вызывается ExitThread (а не exit или ExitProcess), и выполняются потоки (в конечном итоге созданные первичным потоком), то можно наблюдать такое поведение. Тем не менее, просто вернуться в WinMain вызовет ExitProcess, а это означает, что все потоки должны быть завершены.

Поправьте меня, если это неправильно.

2
ответ дан 4 December 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: