Когда поток уничтожается принудительно, например, из диспетчера задач или из Process Explorer, который не меняет идентификатор потока. Дескриптор потока все еще существует, потому что ваш процесс еще не закрыл его. И идентификатор потока, связанный с этим потоком, все еще существует. Так что GetThreadId
всегда будет возвращать ненулевое значение.
Что касается кода выхода, вы не можете получить значимое значение для кода выхода, поскольку поток не завершил работу. Это было убито. У него никогда не было возможности установить код выхода.
Что вы должны сделать, это использовать одну из функций ожидания, например, WaitForSingleObject
, ждать на вашем дескрипторе потока. Если это ожидание завершается из-за того, что поток был уничтожен, функция ожидания вернется и сообщит об успешном ожидании, а код завершения потока будет сообщен как 0
. Насколько я знаю, с помощью Windows API вы не можете определить, что ваш поток был аномально уничтожен.
Что вы могли бы сделать, это использовать свой собственный механизм, чтобы указать, что завершение было ненормальным. Создайте флаг, принадлежащий потоку, чтобы записать, что завершение было нормальным. Установите флаг в false, когда поток начнет выполняться. Когда поток завершается нормально, установите флаг в значение true. Таким образом, вы можете определить, был ли поток завершен ненормально, прочитав значение этого флага после завершения потока.