живая нить с ++? - PullRequest
       2

живая нить с ++?

0 голосов
/ 01 марта 2012

Как?

Я пробовал WaitingForSingleObject, GetExitCodeThread и т. Д., Но когда я убиваю поток с помощью Process Explorer, ничего не происходит.

while(true)
{
    if(GetThreadId(this->hWatchThread) == 0) // Always return killed thread id!
        break;
}

Upd: Когда я уничтожаю поток, он перестает работать, но я не могу получить код выхода или нулевое значение из GetThreadId

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Когда поток уничтожается принудительно, например, из диспетчера задач или из Process Explorer, который не меняет идентификатор потока. Дескриптор потока все еще существует, потому что ваш процесс еще не закрыл его. И идентификатор потока, связанный с этим потоком, все еще существует. Так что GetThreadId всегда будет возвращать ненулевое значение.

Что касается кода выхода, вы не можете получить значимое значение для кода выхода, поскольку поток не завершил работу. Это было убито. У него никогда не было возможности установить код выхода.

Что вы должны сделать, это использовать одну из функций ожидания, например, WaitForSingleObject, ждать на вашем дескрипторе потока. Если это ожидание завершается из-за того, что поток был уничтожен, функция ожидания вернется и сообщит об успешном ожидании, а код завершения потока будет сообщен как 0. Насколько я знаю, с помощью Windows API вы не можете определить, что ваш поток был аномально уничтожен.

Что вы могли бы сделать, это использовать свой собственный механизм, чтобы указать, что завершение было ненормальным. Создайте флаг, принадлежащий потоку, чтобы записать, что завершение было нормальным. Установите флаг в false, когда поток начнет выполняться. Когда поток завершается нормально, установите флаг в значение true. Таким образом, вы можете определить, был ли поток завершен ненормально, прочитав значение этого флага после завершения потока.

0 голосов
/ 01 марта 2012

Если вы хотите что-то сделать после выхода из потока:

WaitForSingleObject(handle_to_your_thread,INFINITE);
MessageBox(NULL,"Thread has exited","Foo",MB_ICONINFORMATION);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...