Читайте также:
|
|
Програмний інтерфейс керування потоками у Windows ХР є частиною Win32 АРІ.
Такий інтерфейс ще називають інтерфейсом потоків Win32. Розглянемо особливості його використання.
Створення потоків у Win32 АРІ
У Win32 АРІ, як зазначалося раніше, для створення потоку призначена функція
CreateThread (), а для його завершення — EndThread ().
На практиці, однак, пару CreateThread()/EndThread() є сенс використати лише
тоді, коли з коду, що виконує потік, не викликаються функції стандартної бібліотеки мови С (такі, як printf () або strcmp ()).
Річ у тому, що функції стандартної бібліотеки С у Win32 АРІ не пристосовані
до використання за умов багатопотоковості, і для того щоб підготувати потік до
роботи за таких умов, необхідно під час його створення і завершення виконувати
деякі додаткові дії. Ці дії враховані у спеціальних бібліотечних функціях роботи
з потоками, описаних у заголовному файлі process.h. Це функція _beginthreadex()
для створення потоку й _endthreadex() - для завершення потоку.
Розглянемо синтаксис функції _beginthreadex(). Відразу ж наголосимо, що той
самий набір параметрів (відмінний лише за типами) передають і у функцію
CreateThread (),
#include <process.h>
unsigned long _beginthreadex(void *security, unsigned stack_size.
unsigned WINAPI (*thread_fun)(void *).
void *argument, unsigned init_state, unsigned *tid):
де: security - атрибути безпеки цього потоку (NULL — атрибути безпеки за замовчуванням);
stack_size — розмір стека для потоку (зазвичай 0, у цьому разі розмір буде таким самим, що й у потоку, який викликає _beginthreadex());
thread_fun - покажчик на функцію потоку;
argument — додаткові дані для передачі у функцію потоку;
іnit_state — початковий стан потоку під час створення (0 для потоку, що почне виконуватися негайно, CREATE_SUSPEND для припиненого);
tid — покажчик на змінну, в яку буде записано ідентифікатор потоку після виклику (0, якщо цей ідентифікатор не потрібний).
Функція _beginthreadex() повертає дескриптор створеного потоку, який потрібно перетворити в тип HANDLE:
HANDLE th - (HANDLE)_beginthreadex(...);
Після отримання дескриптора, якщо він у цій функції більше не потрібний,
його закривають за допомогою CloseHandle() аналогічно до дескриптора процесу:
CloseHandle(th);
Розглянемо приклад задання функції потоку. Додаткові дані, які передаються
під час виклику _beginthreadex() за допомогою параметра argument, доступні в цій
функції через параметр типу void *
unsigned int WINAPI thread_fun (void *num) {
printf ("потік %d почав виконання\n”. (int)num);
// код функції потоку
printf ("потік %d завершив виконання\n*\ (int)num);
}
Ось приклад виклику _beginthreadex() з усіма параметрами:
unsigned tid:
int number = 0:
HANDLE th = (HANDLE) _beginthreadex (
NULL. 0. thread_fun. (void *)++number, 0, &tid);
Після створення потоку може виникнути потреба змінити його характеристики. Якщо це необхідно зробити у функції потоку, варто знати, як отримати доступ
до його дескриптора. Для цього використовують функцію GetCurrentThread ():
unsigned int WINAPI thread_fun (void *num) {
HANDLE curth = GetCurrentThread():
}
Завершення потоків у Win32 API
Функцію потоку можна завершити двома способами.
1. Виконати у ній звичайний оператор return (цей спосіб є найнадійнішим):
unsigned WINAPI thread_fun (void *num) {
return 0;
}
2. Викликати функцію _endthreadex() з параметром, що дорівнює коду повернення:
unsigned WINAPI thread_fun (void *num) {
_endthreadex(0);
}
Дата добавления: 2014-12-20; просмотров: 35 | Поможем написать вашу работу | Нарушение авторских прав |