博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Chapter11-"windows线程池"之 间隔执行函数
阅读量:5357 次
发布时间:2019-06-15

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

     按照一定的时间间隔,周期性调用某个函数,大致需要用到以下五步

  1. 按照一定的时间间隔,周期性被调用的的原型如下
    VOID CALLBACK TimerCallback(  _Inout_      PTP_CALLBACK_INSTANCE Instance,  _Inout_opt_  PVOID Context,  _Inout_      PTP_TIMER Timer);
  2. 调用将TimerCallback函数通知给线程池(thread pool)
    PTP_TIMER WINAPI CreateThreadpoolTimer(  _In_         PTP_TIMER_CALLBACK pfnti, // 定时回调函数地址,也就是上面的TimerCallback函数地址  _Inout_opt_  PVOID pv, // 传递给TimerCallback函数的参数  _In_opt_ PTP_CALLBACK_ENVIRON pcbe //TimerCallback函数的执行环境,如果为NULL则在默认环境下执行);
  3. 调用向线程池注册由CreateThreadpoolTimer函数创建的 PTP_TIMER。
    VOID WINAPI SetThreadpoolTimer(  _Inout_   PTP_TIMER pti, // CreateThreadpoolTimer函数创建的PTP_TIMER  _In_opt_  PFILETIME pftDueTime, // 定时器启动的时间(以100ns为单位)                         // 如果是负数,则是一个相对值,表示现在距离定时器函数首次执行的时间间隔                         // 如果是正数,则表示首次执行时间距离 1600年1月1日 的时间间隔  _In_  DWORD msPeriod, // 指定定时器函数多久执行一次。如果msPeriod = 0,表示定时器函数之执行一次  _In_opt_  DWORD msWindowLength  // 定时器执行的时间窗口。);
  4. 调用 WaitForThreadpoolTimerCallbacks 函数等待 PTP_TIMER 的回调函数返回,并指定是否取消挂起的 PTP_TIMER 请求。
  5. 调用关闭注册的定时器,系统会自动释放相关资源。
#include 
#include
#include
#include
VOID CALLBACK TimeoutCallback( PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PTP_TIMER pTimer ){ time_t now_time; now_time = time(NULL); struct tm *tblock; tblock = localtime(&now_time); printf("Local time is: %s",asctime(tblock)); }void main(){ // Create the threadpool timer object PTP_TIMER lpTimer = CreateThreadpoolTimer(TimeoutCallback, NULL, NULL); // Start the timer in one second to trigger every 1 second ULARGE_INTEGER ulRelativeStartTime; ulRelativeStartTime.QuadPart = (LONGLONG) -(10000000); // start in 1 second FILETIME ftRelativeStartTime; ftRelativeStartTime.dwHighDateTime = ulRelativeStartTime.HighPart; ftRelativeStartTime.dwLowDateTime = ulRelativeStartTime.LowPart; SetThreadpoolTimer( lpTimer, &ftRelativeStartTime, 1000, // Triggers every 1000 milliseconds 0 ); getchar(); WaitForThreadpoolTimerCallbacks(lpTimer, FALSE); // Clean up the timer CloseThreadpoolTimer(lpTimer); printf("ThreadpoolTimes is closed!\n"); getchar(); }
系列文章是本人看《windows核心编程》时的一些学习笔记,有疏忽之处,欢迎各位网友指正。QQ邮箱:job.zhanghui@qq.com

转载于:https://www.cnblogs.com/java20130722/archive/2013/01/26/3207102.html

你可能感兴趣的文章
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>
Web服务器的原理
查看>>
常用的107条Javascript
查看>>