【发布时间】:2021-07-11 23:34:42
【问题描述】:
我正在编写一个 C++ 程序,它必须每毫秒执行一次函数才能与硬件交互。由于 Windows 10 不是实时的,我发现多媒体计时器是我可以使用的最好的东西。
设置:
我在 Windows 10 上使用适用于 x86 的 Visual Studio 2019 编译器版本 19.28.29914。
我有以下设置多媒体计时器的代码:
// Get the minimum timer resolution
TIMECAPS tc_;
timeGetDevCaps(&tc_, sizeof(TIMECAPS));
// Set the minimum timer resolution
UINT wTimerRes_ = min(max(tc_.wPeriodMin, 1), tc_.wPeriodMax);
timeBeginPeriod(wTimerRes_);
// Start the timer
UINT uDelay = max(min(1, tc_.wPeriodMax), wTimerRes_);
MMRESULT status = timeSetEvent(uDelay, wTimerRes_, (LPTIMECALLBACK)&Foo::callback, 0, TIME_PERIODIC);
callback 函数声明为Foo 类的静态私有成员函数,如下所示:
static void PASCAL callback(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
并实现为:
void PASCAL Foo::callback(UINT wTimerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2){
// My "real-time" code
}
问题:
一开始我的返回类型中没有PASCAL关键字,我的程序一启动就崩溃了。其他时候,它跑了一会儿,但最终也崩溃了。当我添加这个关键字时,所有的问题似乎都消失了。我在网上找不到太多关于此的信息,所以我的问题是:
- 这个神秘的关键字是什么?为什么多媒体计时器需要它才能正常工作?
- 还有哪些其他多媒体计时器替代方案可以在 Windows 上实现尽可能实时的性能?
【问题讨论】:
-
我建议避免强制转换,除非它们是必要的。如果没有强制转换,程序就不会崩溃,而不是崩溃。
标签: c++ c windows timer real-time