Операционные системы. Кручинин А.Ю. - 49 стр.

UptoLike

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

49
dwCreationFlags флажки, которые управляют созданием потока. Если установлен
флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не
запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это
значение нулевое, поток запускается немедленно после создания.
lpThreadId указатель на переменную, которая принимает идентификатор потока.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения
дескриптор нового потока. Если функция завершается с ошибкой, величина
возвращаемого значения NULL. Чтобы получать дополнительные данные об
ошибках, вызовите GetLastError.
При успешном выполнении функция создаѐт поток, возвращает его
дескриптор, а в переменную, на которую указывает параметр lpThreadId, заносится
идентификатор потока. Выполнение потока начинается с выполнения функции,
адрес которой указывает параметр lpStartAddress. Это любая функция, в которую
передается один аргумент, являющийся указателем на любую величину
lpParameter. Если передавать ничего не надо, то надо присваивать значение NULL.
Формат функции:
DWORD WINAPI Название_функции(LPVOID);
Работа потока завершается оператором return в конце функции. Пример
создания потока представлен в листинге 17. Здесь Func указывает на функцию, с
которой выполняется новый поток.
DWORD lpT;
HANDLE h=CreateThread(NULL,0,Func,NULL,0,&lpT);
CloseHandle(h);
Листинг 17 Создание нового потока
В качестве примера использования нескольких потоков в одном процессе,
можно привести ситуацию, когда приложению нужно записать большой файл на
диск. При использовании одного потока доступ к другим функциям программы
будет недоступен до окончания операции.
Одной из распространенных задач, является поиск файлов в заданном
каталоге. Для поиска файлов используются две функции FindFirstFile и
FindNextFile. Алгоритм работы следующий создается рекурсивная функция,
например FindFile. В неѐ передается начальный каталог, в котором необходимо
найти все входящие файлы и каталоги. Первоначально вызывается функция:
Функция FindFirstFile
HANDLE FindFirstFile
(
LPCTSTR lpFileName, // адрес пути для поиска
LPWIN32_FIND_DATA lpFindFileData); // адрес структуры
// LPWIN32_FIND_DATA, куда будет записана
// информация о файлах
dwCreationFlags – флажки, которые управляют созданием потока. Если установлен
флажок CREATE_SUSPENDED, создается поток в состоянии ожидания и не
запускается до тех пор, пока не будет вызвана функция ResumeThread. Если это
значение нулевое, поток запускается немедленно после создания.
lpThreadId – указатель на переменную, которая принимает идентификатор потока.
     Возвращаемые значения
     Если функция завершается успешно, величина возвращаемого значения –
дескриптор нового потока. Если функция завершается с ошибкой, величина
возвращаемого значения – NULL. Чтобы получать дополнительные данные об
ошибках, вызовите GetLastError.

     При успешном выполнении функция создаѐт поток, возвращает его
дескриптор, а в переменную, на которую указывает параметр lpThreadId, заносится
идентификатор потока. Выполнение потока начинается с выполнения функции,
адрес которой указывает параметр lpStartAddress. Это любая функция, в которую
передается один аргумент, являющийся указателем на любую величину –
lpParameter. Если передавать ничего не надо, то надо присваивать значение NULL.
Формат функции:
DWORD WINAPI Название_функции(LPVOID);
     Работа потока завершается оператором return в конце функции. Пример
создания потока представлен в листинге 17. Здесь Func – указывает на функцию, с
которой выполняется новый поток.

DWORD lpT;
HANDLE h=CreateThread(NULL,0,Func,NULL,0,&lpT);
CloseHandle(h);
                       Листинг 17 – Создание нового потока

      В качестве примера использования нескольких потоков в одном процессе,
можно привести ситуацию, когда приложению нужно записать большой файл на
диск. При использовании одного потока – доступ к другим функциям программы
будет недоступен до окончания операции.
      Одной из распространенных задач, является поиск файлов в заданном
каталоге. Для поиска файлов используются две функции FindFirstFile и
FindNextFile. Алгоритм работы следующий – создается рекурсивная функция,
например FindFile. В неѐ передается начальный каталог, в котором необходимо
найти все входящие файлы и каталоги. Первоначально вызывается функция:

     Функция FindFirstFile
HANDLE FindFirstFile
(
    LPCTSTR lpFileName,                // адрес пути для поиска
    LPWIN32_FIND_DATA lpFindFileData); // адрес структуры
                                       // LPWIN32_FIND_DATA, куда будет записана
                                       // информация о файлах

                                                                                   49