版权声明: https://blog.csdn.net/dashoumeixi/article/details/83541226
void test_waitabletimer()
{
//创建一个
HANDLE hTimer = CreateWaitableTimer(0, FALSE, NULL);
SYSTEMTIME st = {0};
GetLocalTime(&st);
_tprintf(TEXT("系统时间:%d - %d - %d %d:%d : %d\n"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
//准备2个时间对象 . Timer需要UTC时间
FILETIME ft_local, ft_utc;
//转时间
SystemTimeToFileTime(&st, &ft_local);
//utc时间
LocalFileTimeToFileTime(&ft_local, &ft_utc);
//也可以 : ft_utc.dwHighDateTime<<32 | ft_utc.dwLowDateTime
LARGE_INTEGER li_utc;
li_utc.LowPart = ft_utc.dwLowDateTime;
li_utc.HighPart = ft_utc.dwHighDateTime;
//从当前时间就触发一次, 接着2秒触发一次
BOOL bSuccess = SetWaitableTimer(hTimer, &li_utc, 2000, NULL, NULL, FALSE);
if (!bSuccess){
_tprintf(TEXT("SetWaitableTimer 失败 ,err:%d\n"), GetLastError());
CloseHandle(hTimer);
return;
}
for (int i = 0; i < 5; ++i){
printf("waiting!\n");
if (!WaitForSingleObject(hTimer, -1)){
_tprintf(TEXT("ok \n"));
}
}
CloseHandle(hTimer);
}
APC : 可以把下面的例子修改成一个线程 , 把 for 修改成 while(1) 这样, 就有一个定时器线程了
void test_waittimer2()
{
HANDLE hTimer = CreateWaitableTimer(0, FALSE, NULL);
//如果是负数 , 则是相对当前的时间 .
LARGE_INTEGER li;
li.QuadPart = -3 * 10000000; //过3秒
//过3秒触发, 之后每3秒触发一次
SetWaitableTimer(hTimer, &li, 3000, TimerAPCProc, NULL, NULL);
for (int i = 0; i < 5; ++i)
{
printf("waiting!\n");
SleepEx(INFINITE, TRUE);
printf("index:%d\n", i);
}
CancelWaitableTimer(hTimer);
CloseHandle(hTimer);
}