visual-studio - 如何在 Windows 中使用计时器

标签 visual-studio visual-c++

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

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

最佳答案

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

关于visual-studio - 如何在 Windows 中使用计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/772343/

相关文章:

c++ - BitBlt 将位图放到启动屏幕上

c++ - 什么是 "stack alignment"?

c++ - 使用指向成员和宏的指针

c# - 如何在 VS 2013 中调试 CLR 存储过程

.net - 如何从 Visual Studio 解决方案启动特定项目

c++ - Visual C++ 如何在 MySql 中查找列的名称

.net - RDLC ReportViewer报告中的项目引用

visual-studio - 为什么 MSBuild 将 .tlog 文件生成到 CMakeFiles/CompilerIdC 中,我该如何让它停止?

c++ - 判断字段是否为NULL

c++ - 是否可以防止 unordered_map::insert 抛出异常?