博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让可等待的计时器添加APC调用
阅读量:6715 次
发布时间:2019-06-25

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

1 // TimerAPCRoutine.cpp : 定义控制台应用程序的入口点。  2 //  3   4 #include "stdafx.h"  5 #include 
6 #include
7 #include
8 9 10 using namespace std; 11 12 13 void GetSystemTime(); 14 VOID CALLBACK TimerAPCRoutinue( 15 _In_opt_ LPVOID lpArgToCompletionRoutine, 16 _In_ DWORD dwTimerLowValue, 17 _In_ DWORD dwTimerHighValue 18 ); 19 20 21 22 23 int main() 24 { 25 LARGE_INTEGER DueTime; 26 DueTime.QuadPart = -30'000'000LL;//倒计时3秒 从调用到显示的时间 27 28 HANDLE TimeHandle = NULL; 29 TimeHandle = 30 CreateWaitableTimer( 31 NULL, 32 //TRUE, //BOOL bManualReset 33 FALSE, 34 NULL 35 ); 36 37 if (!SetWaitableTimer( 38 TimeHandle, 39 &DueTime, //第一次,The time after which the state of the timer is to be set to signaled 40 1000, //第二次执行与第一次执行的间隔 周期 1秒 The period of the timer 41 TimerAPCRoutinue, 42 NULL, 43 0 44 ) 45 ) 46 { 47 printf("SetWaitableTimer FAIL: %d \r\n", GetLastError()); 48 return 0; 49 } 50 51 //进入可提醒状态 可提醒IO 52 /* 53 while (1) 54 { 55 WaitForSingleObjectEx(TimeHandle, INFINITE,TRUE); 56 } 57 */ 58 //这里的话只能走2次,应该是等待时间的问题 59 /* 60 指针放到APC中,还没有执行,后面一次就来了。要使用SleepEx 61 感觉这里WaitFoeSingleObjectEx 不同的地方 62 */ 63 for (int i = 0;i < 5; i++) 64 { 65 //WaitForSingleObjectEx(TimeHandle, INFINITE,TRUE); //阻塞不住 66 /* 67 windows核心编程 p250 68 线程不应该在等待一个计时器句柄的同时以可提醒的方式等待同一个计时器。 69 70 HANDLE hTimer = CreateWaitableTimer(NULL,FALSE,NULL); 71 SetWaitableTimer(hTimer,...,TimerAPCRoutinyr,...); 72 WaitForSingleObjectEx(hTimer,INFINTE,TRUE); 73 74 我们不应该编写此类代码,因为对WaitForSingleObjectEx的调用 75 实际上会等待计时器两次:一次是可提醒的,另一次是内核对象句柄。 76 当计时器被触发的时候,等待成功,线程被唤醒,这使线程退出可提醒状态 77 APC函数没有被调用。我们一般很少有理由要在使用可等待计时器的同时使用APC函数, 78 因为我们总是可以先等待计时器被触发,然后在执行我们想要的操作。 79 80 */ 81 82 83 SleepEx( 84 INFINITE, // Wait forever 85 TRUE); 86 } 87 88 89 printf("input any key to exit\r\n"); 90 getchar(); 91 92 return 0; 93 } 94 95 VOID CALLBACK TimerAPCRoutinue( 96 _In_opt_ LPVOID lpArgToCompletionRoutine, 97 _In_ DWORD dwTimerLowValue, 98 _In_ DWORD dwTimerHighValue 99 )100 {101 GetSystemTime();102 103 }104 105 void GetSystemTime()106 {107 time_t t = time(0);108 char tmp[64];109 strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z", localtime(&t));110 puts(tmp);111 }

 

转载于:https://www.cnblogs.com/1228073191Blog/p/7496443.html

你可能感兴趣的文章
php 后端实现JWT认证方法
查看>>
[深入理解Redis]读取RDB文件
查看>>
【java并发编程实战6】AQS之独占锁ReentrantLock实现
查看>>
Javascript中进行遍历操作的所有方法
查看>>
JS的原型链和继承
查看>>
python中pyquery无法获取标签名的dom节点
查看>>
面试官:请手写一个webpack4.0配置
查看>>
有关getter 和 setter的使用
查看>>
JavaScript面向对象中的Function类型个人分享
查看>>
记录一次Webpack插件优化的经历
查看>>
【跃迁之路】【505天】程序员高效学习方法论探索系列(实验阶段262-2018.06.25)...
查看>>
ubuntu16.04 搭建java 环境
查看>>
关于 try 和 finally 中的 return
查看>>
JS 1-数据类型
查看>>
(Google I/O '17) Speeding Up Your Android Gradle Builds 在本地的实践
查看>>
最大似然法与似然函数
查看>>
SAPGUI里实现自定义的语法检查
查看>>
快速创建 HTML5 Canvas 电信网络拓扑图
查看>>
JS动画之定时器详解
查看>>
利用Tomcat发布基于Maven所构建的Jersey RESTful Web Service
查看>>