关于SetTimer函数的总结

在使用 SOUI 编写Windows程序时,似乎曾经看到过 SOUI 中限制了 SetTimer 函数能启动的定时器的个数,于是今天就去 MSDN 看了下Windows本身是否也限制了单个程序能启动的定时器个数,于是就有了这篇总结。

先下结论好了:微软在 MSDN 上并没有写明单个程序能启动的定时器的个数。

但是,还是学到了不少关于使用 SetTimer 函数时之前所不知道的地方,下面就来说一说。

惯例,先上 MSDN 关于 SetTimer 函数的原型。

UINT_PTR SetTimer(HWND      hWnd,UINT_PTR  nIDEvent,UINT      uElapse,TIMERPROC lpTimerFunc
);

那么在使用 SetTimer 函数时需要注意的地方是什么呢。

在 MSDN 中关于 nIDEvent 参数有这样的说明:
A nonzero timer identifier. If the hWnd parameter is NULL, and the nIDEvent does not match an existing timer then it is ignored and a new timer ID is generated. If the hWnd parameter is not NULL and the window specified by hWnd already has a timer with the value nIDEvent, then the existing timer is replaced by the new timer. When SetTimer replaces a timer, the timer is reset. Therefore, a message will be sent after the current time-out value elapses, but the previously set time-out value is ignored. If the call is not intended to replace an existing timer, nIDEvent should be 0 if the hWnd is NULL

上面这段话说了三点:

  1. SetTimer函数的第一个参数传递NULL时,SetTimer函数会忽略第二个参数,转而启动一个随机的定时器并返回它的数值,当调用KillTimer函数时需要使用该数值,而不是调用SetTimer函数时传递的数值。
  2. SetTimer函数的第二个参数的数值是当前计时中的定时器的数值时,系统会将那个定时器重置,重新计时,计时数值为最新设置的 uElapse 数值。
  3. 关于 nIDEvent 的大小没有限制。

也就是说,当 hWndNULL 时,无论第二个参数传递的是什么数值(传递 NULL也行),系统启动的都不是你所指定的那个定时器,所以需要自己手动保存好 SetTimer 函数返回的数值,留待以后调用 KillTimer 函数时使用。

而且还要说一点:当 hWndNULL 时,调用线程还是会收到 WM_TIMER 消息的,但是 GetMessagePeekMesage 获取到的 MSG 数据中的 hWndNULL(跟 PostThreadMessage 同理)。所以默认情况下,在MFC中使用 SetTimer(NULL, uElapse, NULL)::SetTimer(NULL, NULL, uElapse, NULL) 时,在 OnTimer 函数中都是无法响应该定时器的,需要重写MFC的 PreTranslateMessage 函数才能响应该定时器。

关于 lpTimerFunc 参数,MSDN 的说法也值得注意:
An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER.

就是说:当 lpTimerFunc 不为NULL时,窗口过程响应WM_TIMER时会执行该函数,并不会执行默认的窗口过程。

所以,在MFC中,如果不想重写MFC的 PreTranslateMessage 函数的话,可以设定 lpTimerFunc 参数,这样也能处理 hWndNULLSetTimer函数了。

好了,上面就是本人在 MSDN 看到的关于 SetTimer 函数的一点总结了。本人限于能力,上文中难免有错误的地方,若读者发现上文的错误,请于评论区中指出,本人看到之后会立即修改的,谢谢。

关于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. MySQL数据库基本操作总结(不断更新中......)
  2. python神经网络训练数据_用Python从头开始实现一个神经网络
  3. 用Play 1.x 实现简单云计算多租户设计(Use Play 1.x To Achieve Multi-Tenancy Design)
  4. 图像的泊松(Poisson)编辑、泊松融合完全详解
  5. Android开发之基本概念
  6. 建立学生选课表 mysql 语句_MySQL常用SQL语句(Python实现学生、课程、选课表增删改查)...
  7. .net byte转java byte_Java Web安全 || Java基础 Java Agent
  8. jquery template.js前端模板引擎
  9. 北斗三号b1c频点带宽_北斗三号导航信号的创新设计(一)
  10. SDUT-3364_欧拉回路
  11. 近10万人基因组数据!美国All of Us项目发布首批人群队列数据
  12. 爬虫基础12(框架Scrapy中间件)
  13. 明日决战!TI8冠军OG与OpenAI人机大战现场探营
  14. JDBC batch批处理Statement executeBatch 具体解释
  15. memcached—Memcache安全性
  16. Java实现简易版的【图书管理系统】
  17. miktex配置cjk中文
  18. Win10系统怎么安装cab文件?
  19. 连接网络打印机报0x00000709解决方案
  20. 网络恶趣实验——二层广播风暴

热门文章

  1. flexsim怎么设置传送带方向_Flexsim仿真教程学习(六)-分拣系统
  2. FFT FNT 简要整理
  3. VS2015彻底卸载干净
  4. matpower常用标准算例
  5. 不想从零开始做分析?Smartbi Eagle应用商店,一招帮你搞定!
  6. 高等数学下册——引力
  7. PHP ZipArchive 实现压缩解压Zip文件
  8. python 拼音输入法_用Python从头开始实现一个中文拼音输入法?
  9. 使用DB2遇到的一些错误SQLCODE=-551,SQLCODE: -204,SQLCODE:-433,SQLCODE: -104,rg.springframework.beans.factory.B
  10. navicat 软件查询mysql表,限制显示条数