Page 69 - 4989
P. 69
параметр), можуть бути рівними NULL. Параметр dwStackSize
слід встановити в 0, щоб використовувався розмір стеку по
замовчуванню. Якщо потік слід запустити одразу після
створення, параметр dwCreationFlags повинен мати значення 0.
Параметр lpStartAddress – це покажчик на функцію, яку буде
виконувати даний потік. Це так звана функція зворотнього
виклику (callback-функція), яка повинна бути визначена в
програмі користувача і яка буде викликана операційною
системою після того як потік буде успішно створений. Функція
потоку повинна мати наступну сигнатуру:
DWORD WINAPI ThreadProc( _In_ LPVOID lpParameter);
Замість ThreadProc у визначенні слід вказати довільне ім’я.
Ця функція приймає один параметр типу «покажчик на VOID»
(відповідає типу void* в С++). Його можна використати, щоб
передати у потік довільну інформацію. У функцію створення
потоку цей параметр передається через 4-й аргумент
(lpParameter) і може являти собою покажчик на довільний тип. У
функції потоку слід привести цей параметр до необхідного типу.
Функція CreateThread повертає дескриптор потоку, який
може бути використаний для операцій з потоком, наприклад,
очікування його завершення. Таке очікування можна здійснювати
функцією WaitForSingleObject (очікування одного об’єкта) або
WaitForMultipleObjects (очікування багатьох об’єктів).
Наприклад, очікування завершення потоку з дескриптором hT на
протязі 5 секунд виконується так:
DWORD res = WaitForSingleObject(hT, 5000);
Другий параметр – це час таймауту в мілісекундах. По
закінченні таймауту функція поверне значення WAIT_TIMEOUT,
а якщо потік завершився раніше таймауту – значення
WAIT_OBJECT_0. Якщо другим параметром вказати константу
INFINITE, очікування буде виконуватись до завершення потоку.
Приклад. Нехай функція потоку буде обробляти масив
елементів типу double, розмір якого відомий:
69