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类中,调用就不用指定窗口句柄了   于是SetTimer函数的原型变为:  UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,UINT ,DWORD))   当使用SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent指的是计时器的标识,也就是名字。nElapse指的是时间间隔,  也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,  也就是使用系统默认的回调函数,系统默认认的是onTime函数。这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:  在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。  每隔一段时间就会自动执行一次。 

 SetTimer计时器是系统资源,使用完毕应及时用KillTimer销毁,关于SetTimer的返回值:如果hWnd为NULL,返回值为新建立的timer的ID,如果hWnd非NULL,返回一个非0整数,如果SetTimer调用失败则返回0 ,简言之,SetTimer的返回值用于将来的销毁。

例1:

  SetTimer(1,1000,NULL);   1:计时器的名称;   1000:时间间隔,单位是毫秒;  NULL:使用onTime函数。   当不需要计时器的时候调用KillTimer(nIDEvent);   例如:KillTimer(1);   2) 调用回调函数   此方法首先写一个如下格式的回调函数   void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);   然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。   二. 或许你会问,如果我要加入两个或者两个以上的 timer怎么办?  继续用SetTimer函数吧,上次的timer的ID是1,这次可以是2,3,4。。。。  SetTimer(2,1000,NULL);   SetTimer(3,500,NULL);   嗯,WINDOWS会协调他们的。当然onTimer函数体也要发生变化,要在函数体内添加每一个timer的处理代码:  onTimer(nIDEvent)   {   switch(nIDEvent)   {   case 1:........;   break;   case 2:.......;   break;   case 3:......;   break;   }

  }

例2:

for(int i = 0; i< 100000; i++)
{
  SetTimer(1,2000,NULL);
}
//如果这个循环运行时间远超过了这个二秒的定时器,是不是也要一直运行完这个循环后,再过两秒后才会进入OnTime()函数?

1。应该是这样的,设置定时器应该只要一次就够了,只要不KillTimer()。系统每隔2秒都会自动调用OnTimer()
2。如果来一次定时器消息对应的函数所需要的CPU工作时间会超过2秒的话,系统也会继续运行本次消息对应的函数,不管需要多长时间都会继续运行;当运行完成了本次定时器消息函数后,系统会立即调用下一次定时器消息,也就是实际的定时器消息间隔时间应该是定时器设置时间减去本次定时器消息函数执行所需要的时间,如果你的消息函数执行时间超过2秒的话,那么系统执行完本次函数后,就会立即执行下一次定时器消息,而基本不需要等待了

有关SetTimer函数的用法的更多相关文章

  1. SetTimer函数的用法

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

  2. Settimer及回调函数的用法

    在网上看了settimer的一些用法发现能用的真没有,,,,可能是我没找对地方,大部分都是无脑复制粘贴,浪费了很多时间,如果你是一个对这种定时器一无所知的小白,那么请你看进来一定不会让你失望的! 实用 ...

  3. 有关日期的函数操作用法总结,to_date(),trunc(),add_months();

    相关知识链接: Oracle trunc()函数的用法 oracle add_months函数 Oracle日期格式转换,tochar(),todate() №2:取得当前日期是一个星期中的第几天,注 ...

  4. Oracle to_date()函数的用法

    Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...

  5. js中bind、call、apply函数的用法

    最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...

  6. Oracle trunc()函数的用法

    Oracle trunc()函数的用法 /**************日期********************/1.select trunc(sysdate) from dual --2013-0 ...

  7. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

  8. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  9. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

随机推荐

  1. Ubuntu 配置swftools(Ubuntu14.04)

    1.下载文件 wget http://swftools.org/swftools-0.9.0.tar.gz .tar.gz wget http://www.ijg.org/files/jpegsrc. ...

  2. arm get_vector_swi_address

    unsigned long* get_vector_swi_addr() { const void *swi_addr = 0xFFFF0008; unsigned ; unsigned ; unsi ...

  3. 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    由于项目中必须得用JDK6来作为Java环境,于是连接SQLServer时出现了com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安 ...

  4. 使用CPU的AVX指令

    arch:AVX 很抱歉GCC还不行……有……倒是 但是不是这么写的 我忘记了……官网上有 http://www.oschina.net/news/66980/kreogist-0-9

  5. 【转】 ubuntu12.04更新源

    原文网址:http://blog.chinaunix.net/uid-26404477-id-3382633.html 摘 要:本文列出ubuntu 12.04 LTS更新源列表,内容为网友整理,此处 ...

  6. VS2013中C++创建DLL导出class类

    1.创建"Win32 Console Application"项目,命名为"ClassDllLib",并在"Application type" ...

  7. hdu1023:卡特兰数

    火车进站问题 卡特兰数引入的例子. 卡特兰数递推公式:h(n)=h(n-1)*(4*n-2)/(n+1) 通项公式:h(n)=c(2n,n)/(n+1)... 这题需要高精度,刚好学了一下java.. ...

  8. Oracle百问百答(四)

    Oracle百问百答(四) 31.怎样查看某用户下的表? select table_name from all_tables where owner=upper('jhemr'); 32.怎样查看某用 ...

  9. 在 Ubuntu 12.04 上安装 GitLab6.0

    安装环境: 操作系统:    Ubuntu 12.4 LTS 英文 数据库:        mysql5.5.32 web服务器: nginx1.4.1 首先, 添加git和nginx的ppa,并升级 ...

  10. WPF多线程问题

    最近碰到这种多线程问题都是在WPF项目中. 1. 问题是这样.有个一主界面线程,然后background线程启动,这个background线程试图去修改主界面里面的数据. 造成死锁. 调用过程,主界面 ...