让可等待的计时器添加APC调用

  1 // TimerAPCRoutine.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5 #include <windows.h>
  6 #include <iostream>
  7 #include <time.h>
  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 }
时间: 2024-11-14 07:30:05

让可等待的计时器添加APC调用的相关文章

可等待计时器添加APC测试

unsigned APIENTRY ThreadProc(void *p) { WaitForSingleObject(g_hWaitableTimer, INFINITE); MessageBox(NULL, _T("线程开始启动"), _T("HELLO"), MB_OK); return 0; } void APIENTRY ApcCompletionRoutine(PVOID pParm, DWORD dwTimerLowValue, DWORD dwTim

添加webservice调用日志

之前想用spring的AOP给webservice添加切面的,但是使用around切面后,居然调用端得不到webservice的返回结果,而且报文的详细情况也不得而知,很是尴尬,所以偷了个懒.但是该做的还是要做,不要以后要求查看调用日志的时候,什么都拿不出,不是一个尴尬能搞定的. 我使用的是基于cxf的webservice,所以添加调用日志的方法也是基于cxf的,其次是配合sping开发webservice.基本的webservice的实现,这里就不再说明. 一.使用LoggingInInter

织梦添加和调用自定义字段的方法

织梦自定义字段要想在任何位置任何模版中调用或者在{dede:list }和{dede:arclist }标签中调用,需要特殊设置.自定义字段就是列表附加字段自定义的字段. 一,织梦如何添加自定义字段:网站后台>核心>频道模型>内容模型管理>选择要添加自定义字段的频道模型,这里以图片集频道举例 注意:创建字段,前台参数这里“使字段可以在列表的底层模板中获得”这个必须勾选 在字段管理>添加新字段中添加(价格属性) 在基本设置里>列表附加字段中添加jiage(可以在列表模板{

实现一个简单的缓存模块&#183;续, 添加Memcached调用实现

jusfr 原创,转载请注明来自博客园. 在之前的实现中,我们初步实现了一个缓存模块:包含一个基于Http请求的缓存实现,一个基于HttpRuntime.Cache进程级的缓存实现,但观察代码,会发现如下问题: 1. 有部分逻辑如 Boolean TryGet<T>(String key, out T entry) 的实现有重复现象,Do not repeat yourself 提醒我们这里可以改进:2. 分区特性虽然实现了,但是使用了额外的接口承载,而大多数运用中,调用者无论是操作缓存项的创

android4.4 framework添加第三方调用接口

近日,将第三方可执行文件封装成接口,移植到了系统中.现将曲折的成功之路做一个总结,与大家共享. 软件平台:android 硬件平台:marvell 第三方可执行文件:AA, BB; 工作需求:两个文件必须按顺序依次执行,完成功能,在framework层要提供相应的api接口,供应用程序调用. 由于此接口与wifi相关,因此framework层面将接口添加到了WifiApManager.java中, --- a/wifi/java/android/net/wifi/WifiApManager.ja

如何添加WebService调用时的用户认证

场景: 当把发布好的WebService地址或WSDL提供给调用方时,需要对方先进行身份的认证通过后才允许接口的进步访问.而不是公开的谁都可以调用. 解决: 1.在IIS中设置对应网站的目录访问权限.禁止匿名访问,开户Windows认证. 2.新建一用户,禁掉用户的远程桌面功能. 注:不要将实现此功能的思路往代码实现上做,那就麻烦了.

springboot 项目添加jaeger调用链监控

1.添加maven依赖<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId>opentracing-spring-cloud-starter</artifactId> <version>0.1.8</version> </dependency> <dependency> <groupId>com.uber.j

第9章 用内核对象进行线程同步(2)_可等待计时器(WaitableTimer)

9.4 可等待的计时器内核对象——某个指定的时间或每隔一段时间触发一次 (1)创建可等待计时器:CreateWaitableTimer(使用时应把常量_WIN32_WINNT定义为0x0400) 参数 描述 psa 安全属性(如使用计数.句柄继承等) bManualReset 手动重置计时器还是自动重置计时器. ①当手动计时器被触发,所有正在等待计时器的线程都变可为可调度. ②当自动计时器被触发时,只有一个正在等待计数器的线程变为可调度 pszName 对象的名字 (2)也可以打开一个己经存在的

windows核心编程之使用线程APC回调安全退出多个等待线程

前言 程序开发中经常遇到需要这些情况:辅助线程正在等待内核对象的触发,主线程需要强制终止辅助线程.我们常常做的就是使用:TerminateThread来强制终止线程.这样做当然是不太好的,强制终止线程后系统不会销毁此线程的堆栈,长久下去内存泄露问题就会很严重了.线程最安全的退出方式当然还是让它自己返回了.本文主要介绍windows核心编程中介绍的一种安全退出线程方式:使用可等待API等待内核对象触发,添加线程APC回调. API介绍 首先得简单介绍下一个重要的windows API DWORD