CreateTimerQueueTimer系列(一)

本文介绍了如何在Windows环境下使用C++通过CreateTimerQueueTimer创建一个延时3秒启动、周期1秒、执行10次的定时器。文章详细解析了gDoneEvent全局对象的作用,以及如何控制线程执行流程。示例代码中,定时器的执行体是一个函数,每次执行时会检查计数器以确保执行次数不超过10次。同时,通过打印线程ID,验证了定时器任务并非在主线程中运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CreateTimerQueueTimer系列(一)

原创,转载请注明出处。

功能简介

主要是介绍CreateTimerQueueTimer的使用。通过创建一个3秒延后启动,每次执行周期为1秒,执行10次的Timer,来执行定时任务。

代码功能点简析

  • gDoneEvent:创建一个全局对象,来控制线程的执行流。调用timer_test的线程,这里就是主线程在一开始创建了一个初始化状态为nonsignaled的gDoneEvent内核对象,后面在timer_test的函数末尾部分调用WaitForSingleObject来等到gDoneEvent内核对象变成signaled状态,才能执行后续的代码,即timer_test会在WaitForSingleObject这行代码处阻塞。
  • timer_test 函数内部调用CreateTimerQueueTimer创建了一个Timer,并指定一些参数:
    • 执行体:TimerRoutine函数
    • 延后执行时间:dueTime 变量
    • Timer的执行周期:period 变量
  • 程序一开始定义了一个gCount 变量,在Timer执行体TimerRoutine内部来控制gDoneEvent对象的状态。以达到10次Timer执行之后,解除主线程的阻塞状态,这样主线程就能执行WaitForSingleObject后面的代码了。
  • 为了知道主线程和TimerRoutine所在执行的线程是不是同一个线程,我们分别在主线程和TimerRoutine内部将当前线程的ID打印出来(通过GetCurrentThreadId函数获取当前线程ID),由“执行结果”章节来看,二者确实不属于同一线程。
  • 以上即为对以下代码示例的一个简要解释。

代码示例

#include <windows.h>
#include <stdio.h>
using namespace std;

HANDLE gDoneEvent;
int gCount = 0;
VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
   
    if (lpParam == NULL)
    {
   
        printf("TimerRoutine lpParam is NULL\n");
    }
    else
    {
   
        // lpParam points to the argument; in this case it is an int

        printf("Timer实际的任务执行. 传入的参数是: %d.\n",
            *(int*)lpParam);
        if (TimerOrWaitFired)
        {
   
            printf("The wait timed out.\n");
        }
        else
        {
   
            printf("The wait event was signaled.\n");
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值