定时器是一个在特定时间或者规则间隔被激发的内核对象。结合定时器的异步程序调用可以允许回调函数在任何定时器被激发的时候执行。

通过调用CreateWaitableTimer()可以创建一个定时器,此函数返回一个指向内核对象的句柄。若定时器已经存在,你可以通过使用OpenWaitableTimer()获得一个进程相关的句柄。无论是通过CreateWaitableTimer() 还是通过OpenWaitableTimer()获得的句柄,在不需要定时器时必须释放,方法是使用函数CloseHandle()。

定时的时间通过调用SetWaitableTimer()来设置,可以设置为一个特定的时刻(如December 16, 1999 at 9:45 PM)或者一个相对的时间(如从现在起每五分钟)。函数SetWaitableTime()定时的时间参数要求LARGE_INTEGER类型。这个值应该符合在结构体FILETIME中描述的格式。如果值是正的,代表一个特定的时刻。如果值是负的,代表以100纳秒为单位的相对时间。你也可以将定时器设置为周期性的自我激发,方法是向SetWaitableTimer()的第三个参数传递一个周期参数(以毫秒为单位)。在CreateWaitableTimer()的第二个参数传递FALSE可以产生一个自动归零的定时器。

在所有的APC中,要执行一个完全例程则线程必须处于监听状态。完全例程将总是被调用SetWaitableTimer()的相同的线程执行,所以此线程必须将必须其自身置于监听状态。可以调用下面的任何一个监听函数来完成监听状态的设置:
        SleepEx();
        WaitForSingleObjectEx();
        WaitForMultipleObjectsEx();
        MsgWaitForMultipleObjectsEx();
        SignalObjectAndWait();

CreateWaitableTimer()函数用于创建一个可等待定时器:

函数原型
HANDLE WINAPI CreateWaitableTimer(
LPSECURITY_ATTRIBUTES lpTimerAttributes,
BOOL bManualReset,
LPCTSTR lpTimerName); 说明
lpSemaphoreAttributes
SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性。如将参数声明为ByVal As Long,并传递零值,就可使用对象的默认安全设置。
bManualReset
Long,如果为TRUE,表示创建一个人工重置计时器;如果为FALSE,则创建一个自动重置计时器。
lpName
String,指定可等待计时器对象的名称。用vbNullString可创建一个未命名的计时器对象。如果已经存在拥有这个名字的一个可等待计时器,就直接打开现成的可等待计时器。这个名字可能不与一个现有的互斥体、事件、信号机或文件映射的名称相符。

函数OpenWaitableTimer()用于得到一个已经存在的可等待计时器的句柄,该句柄与当前进程相关联:

HANDLE OpenWaitableTimer(
DWORD dwDesiredAccess, /* 访问权限 */
BOOL bInheritHandle, /* 是否允许子进程继承该句柄 */
LPCTSTR lpTimerName /* 要打开的对象名称 */
);

在创建的时候,可等待的计时器对象总是处于未触发状态。当我们想要触发计时器时,必须调用SetWaitableTimer()函数:

BOOL SetWaitableTimer(
HANDLE hTimer, /* 想要触发的计时器 */
const LARGE_INTEGER *pDueTime, /* 计时器第一次触发的时间 */
LONG lPeriod, /* 第一次触发后,计时器的触发频度 */
PTIMERAPCROUTINE pfnCompletionRoutine, /* 异步过程调用APC函数 */
LPVOID lpArgToCompletionRoutine, /* APC函数的参数 */
BOOL fResume /* 是否继续执行,一般传FALSE */
);

注意,第2个参数pDutTime和第3个参数lPeriod要联合使用,pDutTime是一个LAGRE_INTEGER结构指针,指明了第一次通知的时间,时间格式是UTC(标准时间),是一个绝对值,如果要设置一个相对值,即让等待定时器在调用SetWaitableTimer函数之后多少时间发出第一次通知,只要传递一个负数给该参数即可,但是该数值必须是100ns的倍数,即单位是100ns。第3个参数指明了以后通知的时间间隔,以毫秒为单位,该参数为0时,表示只有第一次的通知,以后没有通知。

函数CancelWaitableTimer用来将指定的计时器取消:
BOOL WINAPI CancelWaitableTimer(HANDLE hTimer);

注意,以上提到的几个函数需要包含<windows.h>头文件,但是只包含此头文件编译会提示:
'CreateWaitableTimer' undefined; assuming extern returning int
需要在包含头文件之前定义#define _WIN32_WINNT 0x0400,这样就可以解决CreateWaitableTimer()找不到的问题了。

以下是我写的一个简单的例子:

#define _WIN32_WINNT 0x0400
#include <stdio.h>
#include <windows.h> #define _SECOND 10000000 void CALLBACK OnTimer(LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue, DWORD dwTimerHighValue)
{
printf("alarm!\n");
} int main()
{
int i;
int iRet;
LARGE_INTEGER li;
HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
if(hTimer == NULL)
return -1;
li.QuadPart = -2 * _SECOND;
iRet = SetWaitableTimer(hTimer, &li, 1000, OnTimer, NULL, FALSE);
if(iRet == 0)
return -1;
for(i = 0; i < 10; i++)
{
SleepEx(INFINITE, TRUE);
}
system( "PAUSE ");
return 0;
}

转自http://blog.csdn.net/nevasun/article/details/7282421

Windows定时器学习的更多相关文章

  1. 最全的Windows Azure学习教程汇总

    Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器.数据中心.Web 和 PC 上的应用程序. Azure 是一种灵活和支持互操作的平台,能够将 ...

  2. Bash On Windows的学习

    Bash On Windows的学习 Bash On Windows的卸载 删除软件和设置:在 cmd 运行lxrun /uninstall 删除所有文件:在cmd中运行lxrun /uninstal ...

  3. 【记录一次windows技术学习】使用笔记本DOS命令搭建WLAN热点

    [记录一次windows技术学习]使用笔记本DOS命令搭建WLAN热点 时间:2017-10-14 22:36:13 撰写者:AK末影人 [转发请注明出处] --------------------- ...

  4. python从写定时器学习Thread

    目录 python从写定时器学习Thread Timer 对象 粗陋的循环定时器 更 pythonic 循环定时器 FAQ python从写定时器学习Thread python 如何写一个定时器,循环 ...

  5. Windows API 学习

    Windows API学习 以下都是我个人一些理解,笔者不太了解windows开发,如有错误请告知,非常感谢,一切以microsoft官方文档为准. https://docs.microsoft.co ...

  6. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  7. Windows API学习---线程与内核对象的同步

    前言 若干种内核对象,包括进程,线程和作业.可以将所有这些内核对象用于同步目的.对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中.这种状态的切换是由Microsoft为 ...

  8. windows定时器编程

    目前,Windows下的定时器编程主要有三种方式. 1)SetTimer定时器是利用Windows窗口消息WM_TIMER来实现的.使用方法非常简单,SetTimer创建定时器,KillTimer销毁 ...

  9. Windows Security 学习笔记

    对于Windows 在 Security 方面的学习. 纯兴趣. UNIX 的另外开一条路线学习. 话说今天查gpedit.msc的资料的时候发现 M$ 官网上怎么连个文档都没有. 后来才点了 gpe ...

随机推荐

  1. mysql explain 分析sql语句

    鉴于最近做的事情,需要解决慢sql的问题,现补充一点sql语句性能分析之explain的使用方式! 综合返回数据情况,分析各个参数,可以了解sql 使用方法:explain  + sql语句 如 :e ...

  2. 使用Fabric一键批量部署上线/线上环境监控

    本文讲述如何使用fabric进行批量部署上线的功能 这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码. 前提条件: 1.运行fabric脚本的机器和其他 ...

  3. netfilter/iptables和firewalld的关系

    1.netfilter 是linux 内核模块,其中包含了大量的内核规则,而要想对这些内核规则进行操作,就需要用户态的工具. iptables和firewalld就是一个用户态的工具. 2.iptab ...

  4. 平板不能设置代理的情况下利用随身wifi进行http代理访问

    需求来源:平板或手机是个封闭系统无法给wifi设置代理,需要利用filllder进行抓包,内容篡改等实验 拥有硬件资源:PC机器 + 小米随身wifi 方案1: NtBind Dns + Nginx ...

  5. python 解析xml

    在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...

  6. 手机1520 win8.1升级win10

    昨天买了手机1520,卖家不错:https://item.taobao.com/item.htm?id=525484481986 于是我想把win8.1升级为win10 首先去http://www.i ...

  7. Struts2 06--系统拦截器防止数据重复提交

    一.拦截器简要概述 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在W ...

  8. Single Number2

    题目链接:http://oj.leetcode.com/problems/single-number-ii/ Given an array of integers, every element app ...

  9. Xuan.UWP.Framework

    开篇博客,以前总是懒,不喜欢写博客什么,其实都是给自己找理由,从今天开始有空就写写博客.新手博客,写得不好轻喷,哈哈! 开始正题,微软移动平台,从WP7开始,经历了WP8,然后WP8.1,到目前得Wi ...

  10. excel中添加拼接行

    Sub 万途标签()Dim iFor i = 1 To Sheets.Count    If Sheets(i).Name = "数据表" Then        If MsgBo ...