摘要:

什么时候我们需要用到SetTimer函数呢?

当你需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数。使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。

Settimer是设置一个计时器并开始执行计时器Ontimer中的代码,Ontimer是计时器所执行的代码。

KillTimer用于停止计时器。 Settimer是设置,Ontimer是响应Settimer消息的。

函数:

头文件 #include<Windows.h>

(1)用WM_TIMER来设置定时器

先请看SetTimer这个API函数的原型

UINT_PTR SetTimer(              HWND hWnd,//和定时器相关联的窗口     UINT_PTR nIDEvent,//一个非0的数字标志这个定时器     UINT uElapse,//指定时间间隔,以毫秒为单位     TIMERPROC lpTimerFunc//一般指定为null );

当在MFC的工程中如下:

UINT_PTR SetTimer(              UINT_PTR nIDEvent,//一个非0的数字标志这个定时器     UINT uElapse,//指定时间间隔,以毫秒为单位     TIMERPROC lpTimerFunc//一般指定为null );

用法如下:

//@param:1 计时器的名称;
//@param: 1000 时间间隔,单位是毫秒;
//@param: NULL 使用onTime函数。
SetTimer(1,1000,NULL);

在每次时间到1s时会触发WM_TIMER消息,其消息响应函数如下:

void CXXX::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值         // 此处加入如下代码就好了:         switch(){         case 1:               //做该做的事情                 //当不需要的时候在此处调用KillTimer(1);               break;         default:               break;         } CDialog::OnTimer(nIDEvent); }

当不需要计时器的时候调用KillTimer(nIDEvent);

KillTimer(1);
(2)多个SetTimer的使用
SetTimer(2,1000,NULL);SetTimer(3,500,NULL);

WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:

onTimer(nIDEvent){switch(nIDEvent){case 1:........;break;case 2:.......;break;case 3:......;break;}}

1.2 调用回调函数

此方法首先写一个如下格式的回调函数

void CALLBACK TimerProc
(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime
);然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

1.3 取消定时器

不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下

BOOL KillTimer(HWND hWnd,          // 窗口句柄UINT_PTR uIDEvent   // ID
);在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
如:KillTimer(1);

测试程序:

#include <iostream>
#include <Windows.h>using namespace std;void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{SYSTEMTIME sys;GetLocalTime(&sys);printf("M/d/d d:d:d.d xingqi \n", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);}void main()
{MSG msg;SetTimer(NULL, 230, 1000, (TIMERPROC)TimerProc);while (GetMessage(&msg, NULL, NULL, NULL)){if (msg.message == WM_TIMER){TranslateMessage(&msg);///TranslateMessage函数将虚拟键消息转换成字符消息/*该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数*/DispatchMessage(&msg);//break; //此处最好有一个这个,不然貌似Killtimer结束不了定时器的样子.}}KillTimer(NULL, 230);}

参考文章:

1. https://blog.csdn.net/u011555996/article/details/77587799

2. https://www.cnblogs.com/lingc/p/3380919.html

3. http://blog.sina.com.cn/s/blog_b74670be0102v5pr.html

4. https://www.cnblogs.com/ssyfj/p/8490468.html

Windows:SetTimer定时器编程相关推荐

  1. 寒江独钓-Windows内核安全编程(完整版).pdf

    寒江独钓-Windows内核安全编程(完整版).pdf   编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件.硬件资源.因此,稍有不慎就有可能将系统变得不稳定.W ...

  2. C++-SetTimer定时器

    1. SetTimer定时器 Windows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息WM_TIMER.它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发 ...

  3. VS2022 VC++下控制台程序SetTimer定时器的应用

    在Vs2022下,应用VC++控制台程序,SetTimer定时器的应用,在很多的介绍例程当中,都使用了 SetTimer(NULL, TimerID, peried, TimerProc); 但是当这 ...

  4. (C#)Windows Shell 外壳编程系列6 - 执行

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列5 - 获取图标 执行 许多人都知道 ShellExecute ,用于执行 ...

  5. Windows 外壳扩展编程入门实例

    Windows 外壳扩展编程入门实例 -- Delphi 篇 作者的话 关于Windows 外壳扩展方面的文章私心以为最好的应当算是Michael Dunn 的TheComplete Idiot's ...

  6. [补] windows C socket编程——大物实验预约

    注 : 心血来潮,想着把这两年没能记录下来的经历,写一波回忆杀.诚然,有些经历十分复杂繁琐,希望能耐下性子,写出好文章来,可惜一时不能全想起来这两年来的种种,就想起来什么便写什么吧. 时间估摸着是大一 ...

  7. (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上一节说到如 ...

  8. windows下socket编程GetLastError()函数返回结果与对照表-转

    原文地址:http://blog.sina.com.cn/s/blog_4880c4bb0100b6a5.html WSAGetLastError()函数返回结果与对照表: Windows Socke ...

  9. 视频教程-精通Win32 API编程-Windows图形界面编程-C/C++

    精通Win32 API编程-Windows图形界面编程 黄强老师,国家软件设计师,软件开发工程师,项目经理.产品经理.培训讲师. 创业合伙人,多年C.C++开发经验,尤擅长移动互联网项目的开发! 黄强 ...

最新文章

  1. QIIME 2教程. 24Python命令行模式Artifact API(2020.11)
  2. keil调用bat文件,实现删除、复制、加密文件功能
  3. PopupWindow的使用
  4. 不用SE11建Structure传Internal Table到Smartforms的方法
  5. unity3d 各个目录的意思
  6. ASP.NET MVC Global.cs - 应用程序事件
  7. IPv6名称到地址的转换函数getaddrinfo()详解
  8. JEP 290 初识
  9. 项目实战 五 拟合直线 获得中线
  10. html css手册,CSS 参考手册
  11. 【作图】origin制作图中图
  12. 大学计算机基础教程期末试题,大一大学计算机基础教程期末考试卷试题 .doc
  13. 删除IBM常见软件进程释放系统资源
  14. 【JAVA】五子棋2.0
  15. CQOI2016滚粗记
  16. srsLTE学习笔记(一)——eNB配置文件enb.conf解析
  17. 计算机毕业设计ssm青岛恒星科技学院机房管理系统0k0u9系统+程序+源码+lw+远程部署
  18. [ACNOI2022]《普林斯普的荣光》
  19. 微信小程序 全面屏适配
  20. JetBrains Mikhail Vink:助开发者Keep Evolving

热门文章

  1. 4.5清明节写个三角形吧
  2. JS、HTML人民币转大写,金额转大写
  3. 日本宣布建8个量子研发基地,狂追中、美两国,意味着什么?
  4. ICLR 2023杰出论文奖出炉!北大获奖,清华、人大等提名
  5. 瓦力部署系统部署java_walle自动化部署平台安装
  6. 【机器学习】决策树分类(简介、原理、代码)
  7. 多模块下依赖其他模块(例如Common模块)时的解决办法
  8. 树莓派开发基础教程目录表
  9. SAP中ABAP编辑器快捷键及文字大小设置一览
  10. opengl绘制位图字体c语言源代码,SFML中的位图字体(OpenGL)