Ожидание объекта с помощью функции WaitForSingleObject
Описание функции WaitForSingleObject:
Функция WaitForSingleObject предназначена для ожидания завершения работы одного объекта синхронизации. Она блокирует выполнение текущего потока до тех пор, пока указанный объект синхронизации не будет сигнализирован или не истечет определенное время ожидания.
Пример использования функции WaitForSingleObject:
#include <windows.h>
#include <iostream>
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
// Ожидание 5 секунд
Sleep(5000);
std::cout << "Поток завершен" << std::endl;
// Сигнализируем об окончании работы
SetEvent(lpParam);
return 0;
}
int main()
{
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (hEvent == NULL)
{
std::cerr << "Не удалось создать объект события" << std::endl;
return 1;
}
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, hEvent, 0, &dwThreadId);
if (hThread == NULL)
{
std::cerr << "Не удалось создать поток" << std::endl;
return 1;
}
std::cout << "Ожидание завершения потока..." << std::endl;
DWORD dwResult = WaitForSingleObject(hEvent, INFINITE);
if (dwResult == WAIT_OBJECT_0)
{
std::cout << "Поток успешно завершен" << std::endl;
}
else if (dwResult == WAIT_TIMEOUT)
{
std::cout << "Истекло время ожидания" << std::endl;
}
else
{
std::cerr << "Произошла ошибка при ожидании объекта" << std::endl;
return 1;
}
// Закрываем дескрипторы объектов
CloseHandle(hThread);
CloseHandle(hEvent);
return 0;
}
В данном примере создается объект события hEvent с начальным состоянием невызванного (FALSE). Затем создается новый поток hThread, который выполняет функцию ThreadFunc, принимая указатель на объект события в качестве параметра. В функции ThreadFunc выполняется задержка в 5 секунд с помощью функции Sleep, после чего вызывается функция SetEvent, сигнализирующая о завершении работы. В основном потоке происходит вызов функции WaitForSingleObject, блокирующего выполнение до тех пор, пока объект события не будет сигнализирован. Результат выполнения функции WaitForSingleObject проверяется с помощью условных операторов. После завершения работы все созданные дескрипторы закрываются с помощью функции CloseHandle.
Использование функции WaitForSingleObject позволяет эффективно организовывать синхронизацию между потоками в многопоточных приложениях. Она позволяет контролировать параллельное выполнение операций и организовывать вызовы функций в правильной последовательности, в зависимости от состояния объектов синхронизации.