2009-04-21 85 views
1

可以使用Windows API设置计时器的各种方法有哪些?每种方法的优点和缺点是什么?如何在Windows中使用计时器

我正在使用MS DevStudio的C++。

+0

@subbu:如果你真的想要得到的帮助就在这里,所以你可能想仔细阅读本:http://www.catb.org /~esr/faqs/smart-questions.html。 你的问题非常广泛,很难理解你想要做什么。所以显然帮助你不是很容易。 – 2009-04-21 12:45:12

+0

你的问题听起来更像是一个需求“所以要让任何示例代码兼容”。要客气,5万多人在这里对你很好, – 2009-04-21 13:02:39

+0

+1,以改善编辑。 – 2009-04-21 13:30:24

回答

1

处理定时器的另一种方法是使用等待定时器对象。这些不需要任何消息处理,不要使用WM_TIMER或回调。因此,它们有点复杂。了解Windows事件系统将会很有帮助。

定时器对象有三种类型:手动复位,同步和周期性;有四个函数用于处理计时器对象:CreateWaitableTimer,SetWaitableTimer,CancelWaitableTimer和CloseHandle(还有第五个OpenWaitableTimer,但这对于很多人来说不太可能有用)。还有一组函数需要通知计时器何时到期:WaitForSingleObject,MsgWaitForSingleObject,WaitForMultipleObjects和MsgWaitForMultipleObjects是最有用的。

使用这些计时器通常的方法是:

CreateWaitableTimer (...) 
SetWaitableTimer (...) 
WaitForSingleObject (...) 
CloseHandle (...) 

与此相比,SetTimer的 - 只有这样,才能知道,如果计时器已过期是轮询它,无论是在一个循环或与infinte超时(即挂起线程直到计时器过去)。

优点:非常灵活,不需要有消息队列。 缺点:很难用

0

通常,看看你要使用的API,例如MFC,Qt或GTK;他们都有计时器班。

如果你不打算使用的GUI API,我个人比较喜欢的boost ::定时器(www.boost.org)

2

有在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消息之间的延迟,分辨率很大,需要消息处理循环。