回答
处理定时器的另一种方法是使用等待定时器对象。这些不需要任何消息处理,不要使用WM_TIMER或回调。因此,它们有点复杂。了解Windows事件系统将会很有帮助。
定时器对象有三种类型:手动复位,同步和周期性;有四个函数用于处理计时器对象:CreateWaitableTimer,SetWaitableTimer,CancelWaitableTimer和CloseHandle(还有第五个OpenWaitableTimer,但这对于很多人来说不太可能有用)。还有一组函数需要通知计时器何时到期:WaitForSingleObject,MsgWaitForSingleObject,WaitForMultipleObjects和MsgWaitForMultipleObjects是最有用的。
使用这些计时器通常的方法是:
CreateWaitableTimer (...)
SetWaitableTimer (...)
WaitForSingleObject (...)
CloseHandle (...)
与此相比,SetTimer的 - 只有这样,才能知道,如果计时器已过期是轮询它,无论是在一个循环或与infinte超时(即挂起线程直到计时器过去)。
优点:非常灵活,不需要有消息队列。 缺点:很难用
通常,看看你要使用的API,例如MFC,Qt或GTK;他们都有计时器班。
如果你不打算使用的GUI API,我个人比较喜欢的boost ::定时器(www.boost.org)
有在Windows系统上的两个定时器相关的功能:SetTimer的和KillTimer函数(我知道这些名字很奇怪 - CreateTimer和DestroyTimer会更加明智,就像在CreateWindow和DestroyWindow中一样,但这是可用的)。
SetTimer可以以两种模式之一运行:计时器事件可以触发用户定义的回调,或者可以将消息发布到窗口。这个函数的格式是:
timer_id = SetTimer (window, event_id, interval, callback);
使用回调:
timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback);
为了得到一个WM_TIMER消息的窗口:
timer_id = SetTimer (window, event_id, interval_in_milliseconds, NULL);
在这两种情况下,调用线程需要当两个变体发出WM_TIMER消息时都有一个消息队列,默认处理程序调用回调函数。
根据您使用的操作系统,间隔值有上限和下限。 See the API documentation了解更多详情。
要释放计时器你用它完成后,请执行下列操作,如果你提供了一个窗口句柄:
KillTimer (window, event_id); // event_id is important!
,如果你使用的回调:
KillTimer (NULL, timer_id);
一个窗口可以有许多定时器与它关联,请为每个定时器使用不同的event_id。重新使用event_id将停止计时器的第一个实例,而不发布WM_TIMER消息。
优点:相当容易使用。 缺点:间隔结束和处理WM_TIMER消息之间的延迟,分辨率很大,需要消息处理循环。
对于高分辨率定时器,使用queryperformancecounter
- 1. 在Windows服务中使用计时器
- 2. 如何在JavaScript中使用计时器?
- 3. 如何在计时器中使用uidatepickerview?
- 4. 如何在uitableview中使用计时器?
- 5. 如何在不再使用计时器时打破计时器
- 6. 在待机期间在Windows Mobile中使用计时器
- 7. 如何使计时器在Python中实时计时?
- 8. Windows Mobile - 使用计时器控件
- 9. 如何设置在asp.net中使用计时器的计数
- 10. 如何使用计时器测试多线程的Windows服务?
- 11. 在VB中使用计时器动画Windows桌面背景
- 12. 在Windows窗体中插入计时器
- 13. 如何在当时使用QTextStream readline之一,使用计时器
- 14. 计时器如何在.net Windows服务中工作?
- 15. 如何使VBScript计时器
- 16. 如何使用计时器计算累加器计时器的算法?
- 17. 如何在使用分片计数器时使用计数器进行排序
- 18. 如何在apache中使用计数器
- 19. 使用Windows窗体中的计时器调用方法
- 20. 如何在c通用Windows应用程序中包含计时器#
- 21. 如何使用JLabel创建计时器?
- 22. 如何使用Swift做CountDown计时器
- 23. C#如何使用计时器?
- 24. 如何使用摆动计时器
- 25. 如何使用Swift添加计时器?
- 26. 如何在jQuery中使用ajax计时器?
- 27. 如何在jQuery中使用mousedown控制计时器?
- 28. 如何在activiti计时器事件中使用默认日历?
- 29. 如何在d3 V3中使用计时器?
- 30. 如何使用javascript在mvc中显示事件计时器
@subbu:如果你真的想要得到的帮助就在这里,所以你可能想仔细阅读本:http://www.catb.org /~esr/faqs/smart-questions.html。 你的问题非常广泛,很难理解你想要做什么。所以显然帮助你不是很容易。 – 2009-04-21 12:45:12
你的问题听起来更像是一个需求“所以要让任何示例代码兼容”。要客气,5万多人在这里对你很好, – 2009-04-21 13:02:39
+1,以改善编辑。 – 2009-04-21 13:30:24