Процессы в Windows - Wait функции

ОГЛАВЛЕНИЕ

 

 

Wait функции

Как можно приостановить работу потока? Существует много способов. Вот некоторые из них.

Функция Sleep() приостанавливает работу потока на заданное число миллисекунд. Если в качестве аргумента вы укажите 0 ms, то произойдет следующее. Поток откажется от своего кванта процессорного времени, однако тут же появится в списке потоков готовых к выполнению. Иными словами произойдет намеренное переключение потоков. (Вернее сказать, попытка переключения. Ведь следующим для выполнения потоком вполне может стать тот же самый.)

Функция WaitForSingleObject() приостанавливает выполнение потока до тех пор, пока не произойдет одно из двух событий:

- истечет таймаут ожидания;

- ожидаемый объект перейдет в сигнальное (signaled) состояние.

По возвращаемому значению можно понять, какое из двух событий произошло. Ожидать с помощью wait-функций можно большинство объектов ядра, например, объект "процесс" или "поток", чтобы определить, когда они завершат свою работу.

Функции WaitForMultipleObjects передается сразу массив объектов. Можно ожидать срабатывания сразу всех объектов или какого-то одного из них.

Пример 2. Программа создает два одинаковых потока и ожидает их завершения.
Потоки просто выводят текстовое сообщение, которое передано им при инициализации.

#include <windows.h>
#include <process.h>

unsigned __stdcall ThreadFunc( void * arg) // Функция потока
{
char ** str = (char**)arg;
MessageBox(0,str[0],str[1],0);
_endthreadex( 0 );
return 0;
};
int main(int argc, char* argv[])
{
char * InitStr1[2] = {"First thread running!","11111"};// строка для первого потока
char * InitStr2[2] = {"Second thread running!","22222"};// строка для второго потока
unsigned uThreadIDs[2];

HANDLE hThreads[2];
hThreads[0] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, InitStr1, 0,&uThreadIDs[0]);
hThreads[1] = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, InitStr2, 0,&uThreadIDs[1]);

// Ждем, пока потоки не завершат свою работу
WaitForMultipleObjects(2, hThreads, TRUE, INFINITE ); // Set no time-out
// Закрываем дескрипторы
CloseHandle( hThreads[0] );
CloseHandle( hThreads[1] );
return 0;
}