`
isolated
  • 浏览: 50884 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Win32编程 - SetTimer的使用

阅读更多

SetTimer函数和WM_TIMER消息是Win32 api中最基本的玩意儿了,任何初学Win32 api编程的人都应该对此很熟悉吧。在这篇文章中,让我们来深入了解一下和SetTimer相关的使用和应用。

  UINT_PTR SetTimer(

  HWND hWnd,

  UINT_PTR nIDEvent,

  UINT uElapse,

  TIMERPROC lpTimerFunc

  );

  我们经常使用的情况是hWnd不为NULL,lpTimerFunc为NULL,在这种情况下系统每隔nIDEvent毫秒会向hWnd窗口投递WM_TIMER消息。唯一需要注意的是:

  1.自2000起,uElapse范围是USER_TIMER_MINIMUM到USER_TIMER_MAXIMUM。超出得话,uElapse设置为1。

  2.WM_TIMER消息其实是在DispatchMessage函数中直接调用hWnd的窗口过程,并且优先级很低,只有在消息队列中没有其它消息的情况下,DispatchMessage才会考虑WM_TIMER。

  3.使用相同的nIDEvent可以重置这个Timer,并且KillTimer(hWnd,nIDEvent)来销毁这个Timer。

  我们再来考虑hWnd为NULL的情况:

  1.首先,最重要的是KillTimer时,传入的Timer Id必须是SetTimer的返回值,而不是调用SetTimer时传入的nIDEvent参数。

  2.调用SetTimer时,如果nIDEvent为0或者是其它没有被使用的Timer Id,则SetTimer会返回一个新的Timer Id。否则,就是重新设置这个Timer。

  3.如果有lpTimerFunc的话,则lpTimerFunc的参数nIDEvent是SetTimer返回的值,而不是你调用SetTimer时传入的值。

  最后看一下lpTimerFunc不为NULL的情况:lpTimerFunc会在DispatchMessage函数中被直接调用,而不会去调用hWnd的窗口过程(也就是说收不到这个消息),无论hWnd是不是NULL。(这里,msdn中貌似有点问题,SetTimer的Remark部分说lpTimerFunc会在默认窗口中被调用,而WM_TIMER中说lpTimerFunc在DispatchMessage中被调用)

  应用

  使用lpTimerFunc可以做一个延时的操作,或者把某些操作推迟到下一个消息循环,而不需要为窗口定义一个新的Timer Id。

  例如,我很喜欢这样写:

  struct _DATA

  {

  //....

  };

  void CALLBACK TimerProc(HWND hwnd,

  UINT uMsg,

  UINT_PTR idEvent,

  DWORD dwTime)

  {

  _DATA * data = (_DATA*)idEvent;

  KillTimer(hwnd,idEvent);

  //do something

  free(data);

  }

  _DATA * data = (_DATA*)malloc(sizeof(_DATA));

  SetTimer(AfxGetMainWindow()->m_hWnd,(UINT_PTR)data,10,&TimerProc);

  首先,使用了TimerProc,不会使窗口收到WM_TIMER消息,那样可以使用idEvent来传递自定义数据而不会和窗口自己使用的Timer id冲突。

  其次,第一个参数hWnd不能为NULL,否则TimerProc的idEvent参数就不是你传入的自定义数据了。

  最后,msdn说SetTimer不能跨线程使用,所以最好不要用这样的方法在向ui线程来插入代码,还是老老实实的发消息吧。


本文转自 ☆★ 包罗万象网 ★☆ - http://www.baoluowanxiang.com 转载请注明出处,侵权必究!
原文链接:http://www.baoluowanxiang.com/a/program/assembler/2010/0523/888.html

分享到:
评论

相关推荐

    cSharp-settimer.zip_C settimer killtimer_C# settimer

    C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。

    使用win32 api的定时器自动改变窗口客户区的颜色

    使用win32 api 的SetTimer函数定义一个定时器,每隔10毫秒改变窗口客户区的颜色;窗口过程在处理WM_TIMER消息时,改变颜色的值;窗口过程在处理WM_PAINT消息时,使用设定好的颜色填充窗口客户区。

    VS2010在Win32控制台使用定时器实例

    基本网上很多定时器都是用MFC写的,而用win32方面比较少,项目用到定时器这块,所以顺便上传一份. 是在VS2010 --> VC++ --> Win32控制台建的工程.里面涉及线程/定时器,简单易用,下载完可直接运行.

    怎么往SetTimer的回调函数传递参数

    怎么往SetTimer的回调函数传递参数

    向 SetTimer的回调函数传递参数

    定时器事件的响应函数,即 VOID CALLBACK TimerProc() 不是由用户程序自己调用的,而是根据时钟事件借由操作系统内核调用的;那么,如何利用这些形式参数,传递程序逻辑处理所需要的参数呢?本文给出一个解决方案,...

    Win32定时器的模拟

    使用Win32 API模拟了SetTimer以及KillTimer的行为,不需要将定时器绑定到窗口句柄上面,同时可以为定时器回调函数传递参数信息。

    线程内使用SetTimer实现定时器

    线程内使用SetTimer实现定时器 代码中MyThreadTimer时线程定时器的实现

    vc++2005定时器settimer()的使用

    vc++2005定时器settimer()的使用 查了一些资料,写了个简单的程序

    MFC Timer(SetTimer/KillTimer)使用方法

    MFC 使用定时器的示例. 1,选择Dialog视图,右击选择“事件”. 2,选择“新建Windows消息/事件(N)”列表,添加WM_TIMER到右侧列表内。 3,cpp会自动生成 ...4,使用SetTimer启动定时器. 5,使用KillTimer取消定时器.

    SetTimer函数

    SetTimer函数的用法,很实用看看就知道了。

    Win32开发Timer示例代码

    本示例重点是演示SetTimer函数和KillTimer函数的使用,示例非常简单,相信入门者也能看得懂的。

    VC++定时器,比SetTimer更精确

    VC++定时器,比SetTimer更精确

    易语言WIN32程序设计之时钟

    易语言WIN32程序设计之时钟源码,WIN32程序设计之时钟,GetModuleHandle,DialogBoxParam,ExitProcess,LoadIcon,SendDlgItemMessage,MessageBeep,SetTimer,KillTimer,EndDialog,GetDlgItemInt,SetDigItemInt

    MFC中OnCreate、Settimer、OnTimer、KillTimer的使用例子

    这一份代码是实现MFC的窗口创建完成需要立刻对某些控件进行响应,以及如何使用SetTimer和KillTimer的例子。 因为在MFC的初始化函数中,窗口创建还没有完成不能对窗口上的控件进行初始化操作,这是需要调用OnCreate...

    VC SetTimer

    下面的代码实现每1/10秒在屏幕上输出字符'a',在vc6与vs2008下调试通过。在vc6下直接可以运行,05或08下按照注释的地方改下就可以了

    C# SetTimer() KillTimer() 演示

    C# SetTimer() KillTimer() 演示 调用系统user32进行计时并输出,时长为1秒。10秒钟后自动停止。 PS:网上没一个能用的源码,结果研究了半天才搞明白。 看到好多人说不能用,应该不会吧,我亲自写出来试过的。我的...

    种类齐全的调试与反调试,来自GitHub

    - Count of processors (Win32/Tinba - Win32/Dyre) - Sandbox known product IDs (todo) - Color of background pixel (todo) - Keyboard layout (Win32/Banload) (todo) ### Anti-Virtualization / Full-System ...

    用MFC中的SetTimer、OnTimer和KillTimer实现的计时器与倒计时的简单Demo

    用MFC中的SetTimer、OnTimer和KillTimer实现的计时器与倒计时的简单Demo。开发工具为VS2010。 MFC中的OnTimer()函数用于实现定时控制功能,定时控制功能主要由下面三个函数共同实现: SetTimer, KillTimer()和...

    在VC编程中使用timeSetEvent

    在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了。如果需要精度更高一些的定时器(精确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的...

    VC MFC Socket编程.rar

    VC MFC Socket编程,这里面不至一个例子,最后做出了一个简单的MFC Socket 聊天室例子,来进一步演示MFC Socket编程的技术细节,对于VC 初学者是非常不错的参考范例。  CDialog::OnInitDialog();  CSocket sock...

Global site tag (gtag.js) - Google Analytics