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");