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

[cpp] view plaincopy print?
[cpp] view plaincopy print?
[cpp] view plaincopy print?
  1. UINT_PTR   SetTimer(
  2. HWND   hWnd,   //   窗口句柄
  3. UINT_PTR   nIDEvent,   //   定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
  4. UINT   uElapse,   //   时间间隔,单位为毫秒
  5. TIMERPROC   lpTimerFunc   //   回调函数
  6. );

例如 
SetTimer(m_hWnd,1,1000,NULL);   //一个1秒触发一次的定时器 
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:

UINT   SetTimer(1,100,NULL); 
函数反回值就是第一个参数值1,表示此定时器的ID号。

第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。 
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。

1.2   调用回调函数 
此方法首先写一个如下格式的回调函数 
void   CALLBACK   TimerProc(HWND   hWnd,UINT   nMsg,UINT   nTimerid,DWORD   dwTime); 
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

2、多个定时器的实现与应用 
我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。 
不使用MFC时,当接收到WM_TIMER消息,WPARAM   wParam中的值便是该定时器的ID 
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子

[cpp] view plaincopy print?
  1. void   CTimerTestDlg::OnTimer(UINT   nIDEvent)
  2. {
  3. switch   (nIDEvent)
  4. {
  5. case   24:   ///处理ID为24的定时器
  6. Draw1();
  7. break;
  8. case   25:   ///处理ID为25的定时器
  9. Draw2();
  10. break;
  11. }
  12. CDialog::OnTimer(nIDEvent);
  13. }

当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:

[cpp] view plaincopy print?
  1. void   CALLBACK   TimerProc(HWND   hWnd,UINT   nMsg,UINT   nTimerid,DWORD   dwTime)
  2. {
  3. switch(nTimerid)
  4. {
  5. case   1:   ///处理ID为1的定时器
  6. Do1();
  7. break;
  8. case   2:   ///处理ID为2的定时器
  9. Do2();
  10. break;
  11. }
  12. }

3、取消定时器

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

[html] view plaincopy print?
  1. BOOL   KillTimer(
  2. HWND   hWnd,   //   窗口句柄
  3. UINT_PTR   uIDEvent   //   ID
  4. );

在MFC程序中我们可以直接调用KillTimer(int   nIDEvent)来取消定时器。
例子

[cpp] view plaincopy print?
  1. #include   <windows.h>
  2. #include   <iostream>
  3. VOID   CALLBACK   TimerProc(HWND   hwnd,UINT   uMsg,UINT   idEvent,DWORD   dwTime);
  4. VOID   CALLBACK   TimerProc(HWND   hwnd,UINT   uMsg,UINT   idEvent,DWORD   dwTime)
  5. {
  6. std::cout   < <   "hello "   < <   std::endl;
  7. }
  8. void   main()
  9. {
  10. int   timer1   =   1;
  11. HWND   hwndTimer;
  12. MSG   msg;
  13. SetTimer(NULL,timer1,5000,TimerProc);
  14. int   itemp;
  15. while ( (itemp = GetMessage(&msg, NULL,NULL,NULL))&& (itemp!=0) &&  (-1 !=  itemp))
  16. {
  17. if   (msg.message   ==   WM_TIMER)
  18. {
  19. std::cout   < <   "i   got   the   message "   < <   std::endl;
  20. TranslateMessage(&msg);
  21. DispatchMessage(&msg);
  22. }
  23. }
  24. }

输出如下: 
i   got   the   message 
hello 
i   got   the   message 
hello 
i   got   the   message 
hello

[cpp] view plaincopy print?
  1. ---------------------------------------------------------------------------------------------------------------------------
  2. // timer.cpp : 定义控制台应用程序的入口点。
  3. //
  4. #include "stdafx.h"
  5. #include   <windows.h>
  6. #include   <stdio.h>
  7. #include   <conio.h>
  8. unsigned   long   WINAPI   Thread(PVOID   pvoid);
  9. void   main()
  10. {
  11. DWORD   dwThreadId;
  12. printf("use   timer   in   workthread   of   console   application<masterz>\n");
  13. HANDLE   hThread   =   CreateThread(
  14. NULL,                                                 //   no   security   attributes
  15. 0,                                                       //   use   default   stack   size
  16. Thread,                                     //   thread   function
  17. 0,                                 //   argument   to   thread   function
  18. 0,                                                       //   use   default   creation   flags
  19. &dwThreadId);
  20. DWORD   dwwait=WaitForSingleObject(hThread,1000*30);
  21. switch(dwwait)
  22. {
  23. case   WAIT_ABANDONED:
  24. printf("main   thread   WaitForSingleObject   return   WAIT_ABANDONED\n");
  25. break;
  26. case   WAIT_OBJECT_0:
  27. printf("main   thread   WaitForSingleObject   return   WAIT_OBJECT_0\n");
  28. break;
  29. case   WAIT_TIMEOUT:
  30. printf("main   thread   WaitForSingleObject   return   WAIT_TIMEOUT\n");
  31. break;
  32. }
  33. CloseHandle(hThread);
  34. _getch();
  35. }
  36. unsigned   long   WINAPI   Thread(PVOID   pvoid)
  37. {
  38. MSG   msg;
  39. PeekMessage(&msg,   NULL,   WM_USER,   WM_USER,   PM_NOREMOVE);
  40. UINT   timerid=SetTimer(NULL,111,3000,NULL);
  41. BOOL   bRet;
  42. int   count   =0;
  43. while(   (bRet   =   GetMessage(   &msg,   NULL,   0,   0   ))   !=   0)
  44. {
  45. if   (bRet   ==   -1)
  46. {
  47. //   handle   the   error   and   possibly   exit
  48. }
  49. else
  50. if(msg.message==WM_TIMER)
  51. {
  52. count++;
  53. printf("WM_TIMER   in   work   thread   count=%d\n",count);
  54. if(count>4)
  55. break;
  56. }
  57. else
  58. {
  59. TranslateMessage(&msg);
  60. DispatchMessage(&msg);
  61. }
  62. }
  63. KillTimer(NULL,timerid);
  64. printf("thread   end   here\n");
  65. return   0;
  66. }

C++中的定时器-SetTimer相关推荐

  1. VC++控制台程序中使用定时器

    我现在项目是一个控制台程序,用到的Win32API都是与界面无关的,今天需要加入定时器刷新的功能,由于没有消息循环,所以WM_TIMER消息应该如何处理呢?综合了下网上找到的资料,写了个简单的demo ...

  2. MFC的DLL中实现定时器功能

    方法一:创建一个线程, 反复读系统时间不就可以了? 如果定时要求不严,用Sleep就可以了.DWORD WINAPI TimerThread(LPVOID pamaram) { UINT oldTic ...

  3. CAPL基础篇-----CAPL中的定时器操作

    前言:使用CPAL往往想要发送周期性的报文这时就需要定时器来完成周期性报文的发送.关于报文的发送,会有下面的章节介绍,本章主要讲解定时器的操作. 1:定时器的种类. 在CAPL中定时器分两种:一种是以 ...

  4. java怎么加定时器_JAVA WEB程序中添加定时器

    JAVA WEB程序中添加定时器 //这是我的定时器类,用来定时执行某段任务: package com.my.time; import java.text.ParseException; import ...

  5. lwip协议栈中超时定时器实现原理

    lwip协议栈中超时定时器实现原理 1,超时定时器存在的目的: tcpip协议中存在很多需要定时处理的任务,包括一次性超时处理和周期性超时处理. 以tcp传输为例,每条连接总共需要建立七个定时器,依次 ...

  6. 51单片机中的定时器

    文章目录 1 51单片机中的定时器介绍 1.1 定时器的初步认识 1.2 定时器的寄存器 1.3 使用定时器的方法 1.4 定时时间的计算 2 定时器模式1 2.1 定时器模式1原理分析 2.2 使用 ...

  7. linux内核定时器死机,浅析linux内核中timer定时器的生成和sofirq软中断调用流程

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

  8. 嵌入式操作系统内核原理和开发(实时系统中的定时器)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 关于定时器的内容,其实我们之前也讨论过,也书写过相应的代码,但是表达得比较晦涩,效率也比较低. ...

  9. swoole 类中使用定时器

    swoole 类中使用定时器  服务端 server <?php class TimerServer {private $serv;public function __construct() { ...

最新文章

  1. 【LeanEAP.NET】精益企业应用平台---源码Demo下载
  2. python网页服务器_python编写简单网页服务器
  3. Java基础篇:抽象类与接口
  4. Mac环境下安装Sass
  5. 160 - 39 damn
  6. cacti配置流量汇总
  7. java 二分搜索获得大于目标数的第一位_Java后端架构师技术图谱,你都了解多少?...
  8. cisco交换机命令大全(11)
  9. SIFT算法系列之尺度空间
  10. UA PHYS515A 电磁理论IV 时变电磁场理论4 电磁场的动量与麦克斯韦压缩能张量
  11. adobe flash java_Adobe 发布最后的 Flash 更新:官方强烈建议立即卸载
  12. 常见文件文件头文件尾格式总结及各类文件头
  13. 360Win10的360wifi无速度问题
  14. 天猫精灵GXIC2020 AIOT物联网大赛获奖了
  15. Hazelcast IMDG参考中文版手册-第十一章-分布式查询
  16. 怎么将.tex文件转换成pdf
  17. 基于vue的todolist案例
  18. JVM性能调优4_JVM的执行子系统__享学课堂
  19. 资产管理系统有哪些功能模块和作用
  20. 再议事理图谱(首届事理图谱研讨会参后感)

热门文章

  1. 【Linux入门指北】linux基本命令的使用 实验篇
  2. ant design vue table表格组件实现隔行变色
  3. 【前端开发学习】2. CSS
  4. CAD dxflib 直线双向箭头标注
  5. Ue 解决滑步的方案
  6. 用python画玫瑰花的代码
  7. scala Object关键字声明的类直接调用方法、伴生对象
  8. ccf csp分蛋糕java_CCFCSP 201703-1 分蛋糕(100score)
  9. 同一个网络下两台设备看直播时,进度不是一致的?浅谈其运作原理
  10. 随性、随遇、随缘、随喜