Самый простой способ заставить поток ждать в течение определенного периода времени - это использовать Sleep()
:
Sleep(1000 * 120);
Но имейте в виду, что вызывающий поток будет полностью заблокирован во время сна. Если вы вызываете это в потоке графического интерфейса, графический интерфейс будет заморожен до тех пор, пока не будет выполнен спящий режим, и управление не вернется к циклу сообщений графического интерфейса.
В этом случае вы можете использовать SetTimer()
, и ваш цикл обработки сообщений GUI обрабатывает WM_TIMER
сообщений по мере необходимости.
Другой вариант - вместо этого использовать Таймер ожидания , например:
HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -10000000 * 120;
SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, FALSE);
// wait for hTimer to be signaled...
CloseHandle(hTimer);
В потоке графического интерфейса вы можете использовать MsgWaitForMultipleObjects()
, чтобы дождаться сигнала таймера, продолжая обслуживать сообщения графического интерфейса, например:
HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -10000000 * 120;
SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, FALSE);
bool keepLooping = true;
do
{
DWORD ret = MsgWaitForMultipleObjects(1, &hTimer, FALSE, INFINITE, QS_ALLINPUT);
if (ret == WAIT_OBJECT_0)
{
// timer elapsed ...
break;
}
if (ret == (WAIT_OBJECT_0 + 1))
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
{
PostQuitMessage(msg.wParam);
keepLooping = false;
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
while (keepLooping);
CloseHandle(hTimer);
Если вам не нужно обрабатывать сообщения GUI во время ожидания по таймеру, тогда вы можете использовать WaitForSingleObject()
или WaitForMultipleObjects()
(в зависимости от того, ожидаете ли вы только на таймере или ожидании на других объектах):
HANDLE hTimer = CreateWaitableTimer(NULL, TRUE, NULL);
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -10000000 * 120;
SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, FALSE);
WaitForSingleObject(hTimer, INFINITE);
CloseHandle(hTimer);