Программирование для Windows NT

       

Завершение задачи


Задача может завершиться как по собственной инициативе, так и по инициативе другой задачи. В первом случае задача либо выполняет оператор возврата из функции задачи, либо пользуется специальными функциями.

Для того чтобы завершить свое выполнение, задача, запущенная с помощью фукнции CreateThread, может вызвать функцию ExitThread, передав ей код завершения:

VOID ExitThread(DWORD dwExitCode);

Для принудительного завершения дочерней задачи родительская задача может использовать функцию TerminateThread, передав ей идентификатор завершаемой задачи и код завершения:

BOOL TerminateThread(

  HANDLE hThread,     // идентификатор завершаемой задачи

  DWORD  dwExitCode); // код завершения

Как родительская задача может получить код завершения дочерней задачи?

Для этого она должна вызвать фукнцию GetExitCodeThread:

BOOL GetExitCodeThread(

  HANDLE  hThread,     // идентификатор завершаемой задачи

  LPDWORD lpExitCode); // адрес для приема кода завершения

Если задача, для которой вызвана фукнция GetExitCodeThread, все еще работает, вместо кода завершения возвращается значение STILL_ACTIVE.

Как мы уже говорили, если задача была запущена с помощью функций _beginthread или _beginthreadex, она может завершать свое выполнение только с помощью функций, соответственно,  _endthread и _endthreadex. Функцию ExitThread в этом случае использовать нельзя, так как при этом не будут освобождены ресурсы, заказанные для работы с мультизадачным вариантом библиотеки времени выполнения.



Содержание раздела