在编程时,会经常使用到定时器。使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。

1.1 用WM_TIMER来设置定时器

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

UINT_PTR SetTimer(
HWND hWnd,              // 窗口句柄
UINT_PTR nIDEvent,      // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse,           // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc   // 回调函数
);

例如 
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)函数来建一个定时器,第三个参数就是回调函数地址。

二、多个定时器的实现与应用

我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子 
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 24: ///处理ID为24的定时器
   Draw1();
   break;
case 25: ///处理ID为25的定时器
   Draw2();
   break;
}
CDialog::OnTimer(nIDEvent);
}
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
   switch(nTimerid)
   {
   case 1: ///处理ID为1的定时器
         Do1();
         break;
   case 2: ///处理ID为2的定时器
         Do2();
         break;
   }
}
三、取消定时器

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

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

如:KillTimer(1);

SetTimer函数总结相关推荐

  1. delphi中setTimer函数的用法

    delphisetTimer函数用来做定时器,可以实现每隔一段时间运行某个程序,需要用到两个函数,SetTimer函数和KillTimer函数. 下面是一个简单的例子: var i :Integer ...

  2. windows中定时操作(SetTimer函数用法)

    最近需要在服务端定时执行某个操作,于是需要用到SetTimer函数.当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了. 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间 ...

  3. vc中定时器的使用 (2)SetTimer函数的使用

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了. 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  4. VC++中定时器SetTimer函数的应用总结

    什么时候我们需要用到SetTimer函数呢?当你 需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  5. setTimer()函数详解

    转自:http://blog.csdn.net/ellor/article/details/1714741 Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件.借助它可以产生定时执行动作 ...

  6. C++:MFC SetTimer定时执行某一函数;

    1.函数说明: 函数原型: SetTimer这个API函数的原型 : UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID ...

  7. SetTimer的使用问题

    SetTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器属于系统资源,使用完应及时销毁. SetTimer的函数原型如下: UINT_PTR SetTimer( HWN ...

  8. 定时器:SetTimer

    注:把编辑框属性设置为"只读" 什么时候我们需要用到SetTimer函数呢?当你需要"每个一段时间"执行一件事的的时候就需要使用SetTimer函数了.使用定时 ...

  9. MFC 定时器用法 SetTimer、KillTimer

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了. 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  10. SetTimer和KillTimer详解

    原文出处:http://www.cppblog.com/ivenher/articles/19969.html 在编程时,会经常使用到定时器.使用定时器的方法比较简单,通常告诉Windows一个时间间 ...

最新文章

  1. 【Unity教程】创建一个完整的驾驶游戏
  2. LeetCode实战:最小栈
  3. 第七篇:SpringBoot 2.x集成Lombok
  4. 【转】推荐两款富文本编辑器:NicEdit和Kindeditor
  5. php写入大文件内容_用PHP读取超大文件的实例代码
  6. 无招胜有招之Java进阶JVM(五)垃圾回收
  7. asynchttpclient 超时_DNF:95更新前还能免费获得一件超时空装备?但这个任务一定完成...
  8. 认识和选购极致画质的显示器
  9. 字典树从第i个构造HDU2846
  10. docker环境搭建redis-cluster集群(多台机器)
  11. sql 查询超时已过期_监视来自SQL Server代理作业的查询超时过期消息
  12. 单选框_flutter Radio 单选框
  13. C#获取数据库中某个字段的最大值
  14. 使用spring ioc基于纯xml配置模拟crud
  15. html绘制位图,Canvas 绘制位图图像 ImageBitmap
  16. 织梦cms安装完成后登录后台出现空白。主要原因是php版本的问题
  17. log4cpp乱码_log4cxx配置使用(一)
  18. D3D游戏关于窗口中如何精确确定鼠标位置的相关讨论
  19. 2022_WWW_Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Learning
  20. 最新版Shiro-SpringBoot项目实战笔记

热门文章

  1. android6.0 Activity(四) Surface创建
  2. 排序算法-归并排序详细讲解(MergeSort)
  3. ug中文字大小设置_UG编辑文字怎么放大或缩小?
  4. 【笔记】人工智能 一种现代方法 人工智能 一种现代方法 第6章 用搜索树对问题求解
  5. 计算机运行命令定时关机,电脑定时关机命令 使用系统命令定时关机 - 云骑士一键重装系统...
  6. AE 2021最新最全插件滤镜大全一键安装版下载 After Effects 2021插件合集WIN一键安装版 支持AE 2021
  7. DB2报错原因汇总(sqlcode sqlstate)
  8. 全局光照算法:IBL
  9. Arcgis学习视频教程
  10. 基于163邮件服务器实现邮箱验证