博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows API一日一练(66)CreateWaitableTimer和SetWaitableTimer函数
阅读量:5830 次
发布时间:2019-06-18

本文共 2121 字,大约阅读时间需要 7 分钟。

用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的
API
函数
CreateWaitableTimer
SetWaitableTimer
来实现了,这对
API
函数创建的时钟是比较精确的,可以达到
100
倍的
10
亿分之一秒。
 
函数
CreateWaitableTimer
SetWaitableTimer
声明如下:
 
WINBASEAPI
__out
HANDLE
WINAPI
CreateWaitableTimerA(
    __in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,
    __in     BOOL bManualReset,
    __in_opt LPCSTR lpTimerName
    );
WINBASEAPI
__out
HANDLE
WINAPI
CreateWaitableTimerW(
    __in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,
    __in     BOOL bManualReset,
    __in_opt LPCWSTR lpTimerName
    );
#ifdef UNICODE
#define CreateWaitableTimer CreateWaitableTimerW
#else
#define CreateWaitableTimer CreateWaitableTimerA
#endif // !UNICODE
 
 
WINBASEAPI
BOOL
WINAPI
SetWaitableTimer(
    __in     HANDLE hTimer,
    __in     const LARGE_INTEGER *lpDueTime,
    __in     LONG lPeriod,
    __in_opt PTIMERAPCROUTINE pfnCompletionRoutine,
    __in_opt LPVOID lpArgToCompletionRoutine,
    __in     BOOL fResume
    );
 
lpTimerAttributes
是设置定时器的属性。
bManualReset
是是否手动复位。
lpTimerName
是定时器的名称。
hTimer
是定时器的句柄。
lpDueTime
是设置定时器时间间隔,当设置为正值是绝对时间;当设置为负数是相对时间。
lPeriod
是周期。
pfnCompletionRoutine
是设置回调函数。
lpArgToCompletionRoutine
是传送给回调函数的参数。
fResume
是设置系统是否自动恢复。
 
调用函数的例子如下:
#001 //
创建定时器
#002  //
蔡军生
 2007/11/06 QQ:9073204
深圳
#003  int CreateTestTimer(void)
#004  {
#005         HANDLE hTimer = NULL;
#006         LARGE_INTEGER liDueTime;
#007 
#008         //
设置相对时间为
10
秒。
#009         liDueTime.QuadPart = -100000000;
#010 
#011         //
创建定时器。
#012        hTimer = CreateWaitableTimer(NULL, TRUE, _T("TestWaitableTimer"));
#013         if (!hTimer)
#014         {              
#015               return 1;
#016         }
#017 
#018         OutputDebugString(_T("10
秒定时器
\r\n"));
#019 
#020         //
设置
10
秒钟。
#021        if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
#022         {        
#023               //
#024               CloseHandle(hTimer);
#025               return 2;
#026         }
#027 
#028         //
等定时器有信号。
#029         if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
#030         {
#031               OutputDebugString(_T("10
秒定时器出错了
\r\n"));   
#032               //
#033               CloseHandle(hTimer);
#034               return 3;
#035         }
#036         else
#037         {
#038               //10
秒钟到达。
#039               OutputDebugString(_T("10
秒定时器到了
\r\n"));            
#040         }
#041 
#042         //
#043         CloseHandle(hTimer);
#044         return 0;
#045  }

转载于:https://www.cnblogs.com/lancidie/archive/2011/03/18/1988135.html

你可能感兴趣的文章
OpenCV 基于超像素分割的图像区域选取方法及源码
查看>>
c#异步调用的几种方式
查看>>
我的周记4——“要繁荣富强,不要再让人欺负了”
查看>>
处理表格撑破列宽,但是列过多时,仍然会撑破,暂解决 15 列左右的表格 。...
查看>>
Beta 冲刺 (5/7)
查看>>
8816
查看>>
Linux的标准输出、标准错误输出、nohup
查看>>
git---分支的合并
查看>>
查看oracle数据库的链接数和用户
查看>>
SparkSQL之UDAF使用
查看>>
随笔分类汇总目录
查看>>
linux驱动之poll操作
查看>>
setTimeout方法
查看>>
Hadoop- Hadoop环境搭建
查看>>
调试技术的优势
查看>>
牛的东西
查看>>
Python基础之杂货铺
查看>>
第二次作业-git的基本操作
查看>>
摘记 史上最强大的40多个纯CSS绘制的图形(一)
查看>>
Android-NDK编译
查看>>