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
   64   65   66   67   68   69   70   71   72   73   74