下面是一个简单的 C 代码例子,使用了 timeBeginPeriod(1) 和 CreateTimerQueueTimer 定时器,多线程编程,实现了周期性定时功能。
#include <stdio.h>
#include <Windows.h>
// 定时器回调函数
VOID CALLBACK TimerCallback(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
printf("Timer callback executed.\n");
}
int main()
{
// 设置系统计时器精度为 1 毫秒
timeBeginPeriod(1);
// 创建定时器队列
HANDLE hTimerQueue = CreateTimerQueue();
// 创建定时器
HANDLE hTimer = NULL;
CreateTimerQueueTimer(&hTimer, hTimerQueue, TimerCallback, NULL, 0, 1000, 0);
// 等待定时器结束
Sleep(5000);
// 删除定时器
DeleteTimerQueueTimer(hTimerQueue, hTimer, NULL);
// 删除定时器队列
DeleteTimerQueueEx(hTimerQueue, NULL);
return 0;
}
在该示例程序中,我们首先调用 timeBeginPeriod 函数设置系统计时器精度为 1 毫秒。然后创建了一个定时器队列,并创建了一个定时器,每隔 1000 毫秒就会触发一次 TimerCallback 回调函数。
在主函数中,我们等待定时器执行了 5 秒钟后,删除定时器并删除定时器队列。最后,程序退出。
需要注意的是,在 CreateTimerQueueTimer 函数中,最后一个参数为事件类型,可以设置为 WT_EXECUTEDEFAULT 或者 WT_EXECUTEONLYONCE。如果设置为 WT_EXECUTEDEFAULT,表示定时器是周期性的,会一直触发回调函数;如果设置为 WT_EXECUTEONLYONCE,表示定时器只会触发一次回调函数。
另外,在回调函数中,我们可以通过 TimerOrWaitFired 参数判断是定时器超时还是等待对象触发。由于这里使用的是定时器,所以该参数始终为 TRUE。