如何在Windows中使用计时器

时间:2009-04-21 12:33:21

标签: visual-studio visual-c++

使用Windows API设置计时器的方法有哪些。每种方法的优缺点是什么?

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

4 个答案:

答案 0 :(得分:3)

Windows系统上有两个与计时器相关的功能:SetTimer和KillTimer(我知道,名称很奇怪 - CreateTimer和DestroyTimer会更加明智,如CreateWindow和DestroyWindow,但这是可用的)。

SetTimer可以在以下两种模式之一中运行:timer事件可以触发用户定义的回调,也可以将消息发布到窗口。该功能的格式为:

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消息,默认处理程序调用回调函数。

根据您使用的操作系统,interval的值有上限和下限。 See the API documentation了解更多详情。

要在完成后释放计时器,如果您提供了一个窗口句柄,请执行以下操作:

KillTimer (window, event_id); // event_id is important!

如果您使用了回调:

KillTimer (NULL, timer_id);

单个窗口可以有许多与之关联的计时器,每个计时器使用不同的event_id。重用event_id会停止计时器的第一个实例而不发布WM_TIMER消息。

优点:相当容易使用。 缺点:间隔结束与处理WM_TIMER消息之间的延迟,分辨率很大,需要消息处理循环。

答案 1 :(得分:1)

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

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

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

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

将此与SetTimer进行比较 - 了解计时器是否已过期的唯一方法是轮询它,无论是循环还是使用infinte超时(即暂停线程直到计时器结束)。

优点:非常灵活,无需拥有消息队列。 缺点:难以使用

答案 2 :(得分:0)

通常,请查看您要使用的API,例如MFC,Qt或GTK;他们都有计时器课程。

如果您不打算使用GUI API,我个人喜欢boost :: timer(www.boost.org)

答案 3 :(得分:0)

对于高分辨率计时器,请使用queryperformancecounter