Основы программирования в Win32API. Марапулец Ю.В. - 27 стр.

UptoLike

Составители: 

{
HANDLE hThread = CreateThread(< параметры >);
// далее следуют стандартные операции инициализации;
// проверка наличия ошибочных условий
if (< условие возникновения ошибки >)
{
ExitThread(ERROR_CODE); // прекратить работу потока
}
// ошибки нет, работа продолжается
return (SUCCESS_CODE); // эта строка программы заставляет систему
вызвать функцию ExitThread()
}…
Параметры ERROR_CODE
и SUCCESS_CODE определяются по вашему
усмотрению. В нашем простом примере поток нетрудно прервать с помощью
команды return:
if( < условие возникновения ошибки > )
{
return(ERROR_CODE); // прекратить работу потока
}…
В данном случае команда return приводит к тому же результату, что и
функция ExitThread(), так как при ее выполнении осуществляется неявный вызов
последней. Эта функция особенно полезна при необходимости прервать поток из
любой подпрограммы, вызываемой внутри функции типа ThreadFunction ().
Когда поток завершается с помощью оператора return, 32-разрядный код за-
вершения автоматически передается функции ExitThread(). После прекращения
работы потока код его завершения может быть получен с помощью функции, при-
веденной ниже:
// один поток вызывает эту функцию для получения
// кода завершения другого потока
BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpdwExitCode);…
Функция GetExitCodeThread() возвращает значение FALSE
в том случае, если
определить код завершения помешала ошибка.
Независимо от того, какявно или неявно (в результате выполнения опера-
тора return) – вызывается функция ExitThread(), она удаляет поток из очереди про-
граммы-планировщика и уничтожает его стек. Однако сам объект при этом сохра-
няется. Поэтому даже после прекращения выполнения потока вы можете
запросить его код завершения. По возможности дескриптор потока следует закры-
вать явно (с помощью функций CloseHandle()), с тем чтобы поток не занимал лиш-
ний объем памяти. При закрытии последнего дескриптора система автоматически
уничтожает поток. Система не может уничтожить выполняющийся поток, даже
если закрыты все его дескрипторы. В этом случае поток будет уничтожен сразу же
после завершения выполнения. Если по завершении процесса остаются незакры-
тые дескрипторы, система закрывает их автоматически и удаляет все «подвешен-
ные» объекты, которые не принадлежат ни одному процессу.
27
{
    HANDLE hThread = CreateThread(< параметры >);
             // далее следуют стандартные операции инициализации;
             // проверка наличия ошибочных условий
    if (< условие возникновения ошибки >)
    {
             ExitThread(ERROR_CODE); // прекратить работу потока
    }
             // ошибки нет, работа продолжается
    return (SUCCESS_CODE); // эта строка программы заставляет систему
вызвать функцию ExitThread()
}…
    Параметры ERROR_CODE и SUCCESS_CODE определяются по вашему
усмотрению. В нашем простом примере поток нетрудно прервать с помощью
команды return:
      if( < условие возникновения ошибки > )
      {
             return(ERROR_CODE); // прекратить работу потока
      }…
       В данном случае команда return приводит к тому же результату, что и
функция ExitThread(), так как при ее выполнении осуществляется неявный вызов
последней. Эта функция особенно полезна при необходимости прервать поток из
любой подпрограммы, вызываемой внутри функции типа ThreadFunction ().
       Когда поток завершается с помощью оператора return, 32-разрядный код за-
вершения автоматически передается функции ExitThread(). После прекращения
работы потока код его завершения может быть получен с помощью функции, при-
веденной ниже:
// один поток вызывает эту функцию для получения
// кода завершения другого потока
BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpdwExitCode);…
      Функция GetExitCodeThread() возвращает значение FALSE в том случае, если
определить код завершения помешала ошибка.
      Независимо от того, как – явно или неявно (в результате выполнения опера-
тора return) – вызывается функция ExitThread(), она удаляет поток из очереди про-
граммы-планировщика и уничтожает его стек. Однако сам объект при этом сохра-
няется. Поэтому даже после прекращения выполнения потока вы можете
запросить его код завершения. По возможности дескриптор потока следует закры-
вать явно (с помощью функций CloseHandle()), с тем чтобы поток не занимал лиш-
ний объем памяти. При закрытии последнего дескриптора система автоматически
уничтожает поток. Система не может уничтожить выполняющийся поток, даже
если закрыты все его дескрипторы. В этом случае поток будет уничтожен сразу же
после завершения выполнения. Если по завершении процесса остаются незакры-
тые дескрипторы, система закрывает их автоматически и удаляет все «подвешен-
ные» объекты, которые не принадлежат ни одному процессу.
                                       27