以下是一个简单的使用timeBeginPeriod(1)和CreateTimerQueueTimer定时器来实现多线程编程的C代码例子:
#include <stdio.h>
#include <Windows.h>
// 定义线程参数结构体
typedef struct ThreadParams {
HANDLE timer; // 定时器句柄
HANDLE event; // 事件句柄
} ThreadParams;
// 定义定时器回调函数
VOID CALLBACK TimerCallback(PVOID lpParam, BOOLEAN TimerOrWaitFired) {
ThreadParams* params = (ThreadParams*)lpParam;
SetEvent(params->event); // 发送事件信号,唤醒主线程
}
int main() {
// 设置系统定时器精度为1毫秒
timeBeginPeriod(1);
// 创建事件句柄,用于线程同步
HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
if (event == NULL) {
printf("CreateEvent failed with error %d\n", GetLastError());
return 1;
}
// 创建定时器句柄,并指定回调函数和线程参数
HANDLE timer;
ThreadParams params = { timer, event };
if (!CreateTimerQueueTimer(
&timer, // 输出参数,用于接收定时器句柄
NULL, // 指定定时器所在队列,NULL表示默认队列
TimerCallback, // 指定定时器回调函数
¶ms, // 指定传递给回调函数的参数
1000, // 指定定时器周期(单位:毫秒)
1000, // 指定首次触发时间(单位:毫秒)
WT_EXECUTEINTIMERTHREAD // 指定回调函数在定时器线程中执行
)) {
printf("CreateTimerQueueTimer failed with error %d\n", GetLastError());
CloseHandle(event);
return 1;
}
// 创建工作线程
HANDLE thread = CreateThread(NULL, 0, [](LPVOID lpParam)->DWORD {
ThreadParams* params = (ThreadParams*)lpParam;
// 等待事件发生
WaitForSingleObject(params->event, INFINITE);
// 取消定时器(必须在定时器线程中调用)
DeleteTimerQueueTimer(NULL, params->timer, NULL);
// 关闭事件句柄
CloseHandle(params->event);
return 0;
}, ¶ms, 0, NULL);
// 等待工作线程结束
WaitForSingleObject(thread, INFINITE);
// 关闭工作线程句柄
CloseHandle(thread);
return 0;
}
以上代码实现了一个定时器,每隔1秒触发一次,触发时会发送一个事件信号,唤醒主线程,然后在工作线程中等待该事件,收到事件后取消定时器并退出。注意,定时器回调函数和工作线程都是在系统线程池中执行的,因此不能阻塞或长时间运行,否则会影响系统性能和稳定性。