小实验:waitabletimer 如果设定了一个已经过期的时间作为初始值会怎么样呢?

本文探讨了在Windows环境下,通过设置一个已经过期的时间作为定时器的初始值,观察定时器是否能立即激活及周期计算方式。实验结果显示,定时器能够立即激活,并且周期计算是从设定的时间开始算起,而非从创建定时器的当前时刻。

实验:设定一个已经过期的时间作为初始值,查看:

1。Timer是否能够立刻激活

2。如果Timer还有周期激活的特性,那么周期应该怎么算呢,是从已经过期的时间开始算起?还是从设定timer的当前时刻算起?


/*
	本代码的意图在于查看如果你给Timer设定一个已经过去的时间,那么:
	1. Timer句柄会不会被激活
	2. Timer会表现出什么样的特征
*/
#include "stdafx.h"
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
	/*定义一些变量*/
	HANDLE hTimer;
	SYSTEMTIME stYearsAgo;
	SYSTEMTIME stNow;
	FILETIME ftYearsAgo;
	FILETIME ftYearsAgoUTC;
	LARGE_INTEGER liTimeGoOff;
	ZeroMemory(&stYearsAgo,sizeof(stYearsAgo));
	unsigned int nInterval = 10*60*1000;
	/*将时间设定为2011年10月13日正午12时整,间隔为10分钟一次*/
	stYearsAgo.wYear = 2011;
	stYearsAgo.wMonth = 10;
	stYearsAgo.wDay = 13;
	stYearsAgo.wHour = 12; 
	::SystemTimeToFileTime(&stYearsAgo,&ftYearsAgo);
	::LocalFileTimeToFileTime(&ftYearsAgo,&ftYearsAgoUTC);
	liTimeGoOff.HighPart = ftYearsAgoUTC.dwHighDateTime;
	liTimeGoOff.LowPart = ftYearsAgoUTC.dwLowDateTime;
	/*设定定时器,查看定时器是否可以被激活,激活后多长时间再被激活(10分钟?还是别的?)*/
	hTimer = ::CreateWaitableTimerA(NULL,FALSE,NULL);
	::SetWaitableTimer(hTimer,&liTimeGoOff,nInterval,NULL,NULL,FALSE);
	while(WaitForSingleObject(hTimer,INFINITE) == WAIT_OBJECT_0)
	{
		::GetLocalTime(&stNow);
		printf("%02u:%02u:%02u - Timer goes off!\n",stNow.wHour,stNow.wMinute,stNow.wSecond);
	}
	return 0;
}

结论:

1。可以立刻激活

2。按照过期时间计算(10分钟一次,于是1点30就再度signal,而不是1点38)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值