QT开发中文网

windows下 使用timeBeginPeriod(1) 之后,再使用CreateTimerQueueTimer定时器,多线程编程,写一个C代码例子

以下是一个简单的使用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,      // 指定定时器回调函数
        &params,            // 指定传递给回调函数的参数
        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;
    }, &params, 0, NULL);

    // 等待工作线程结束
    WaitForSingleObject(thread, INFINITE);

    // 关闭工作线程句柄
    CloseHandle(thread);

    return 0;
}

以上代码实现了一个定时器,每隔1秒触发一次,触发时会发送一个事件信号,唤醒主线程,然后在工作线程中等待该事件,收到事件后取消定时器并退出。注意,定时器回调函数和工作线程都是在系统线程池中执行的,因此不能阻塞或长时间运行,否则会影响系统性能和稳定性。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=721

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?