gpt4 book ai didi

c++ - Windows 计时器有时会以两倍的速度运行

转载 作者:行者123 更新时间:2023-11-28 05:44:24 24 4
gpt4 key购买 nike

我在我的游戏中使用了一个计时器,它是在单例中启动的,并且每毫秒都有一个回调。但是,有时它的运行速度是原来的两倍。真的很少见,我只见过 2 或 3 次(10.000+ 构建,数千次执行)。

这是(重要的)代码:

//local variable in the .cpp:
static float milliseconds=0;

//the "actual" variable used in the game
long int MilliSecondTimer::milliseconds=0;

void CALLBACK TimerProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
milliseconds++;
MilliSecondTimer::GetInstance()->SetTime(int(milliseconds), int(guimseconds));
}

MilliSecondTimer::MilliSecondTimer()
{
UINT TimerID = timeSetEvent(1, 0, TimerProc, 0, TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
}

是不是这样,如果单例的创建时间超过1毫秒,那么它会被调用两次,因为定时器函数会调用

MilliSecondTimer::GetInstance()->SetTime(...)

?

谢谢!

最佳答案

这将很难重现,因为你说它很少发生。但我相信您对问题原因的初步想法可能是正确的。在 timeSetEvent 的 MSDN 文档中说:

The multimedia timer runs in its own thread

这意味着,如您所说,如果单例创建时间超过 1 毫秒,那么在这种情况下单例的构造函数将被调用两次。对构造函数的第二次调用可能来自第一个计时器回调函数中的 MilliSecondTimer::GetInstance()->SetTime(...) 调用,因为此时尚未创建单例并且 MilliSecondTimer::GetInstance() 将再次调用构造函数,进而创建另一个计时器对象。由于每个计时器在其自己的线程中运行,您现在将有两个计时器处理(递增)相同的数据(静态浮点毫秒),这解释了为什么它运行速度快两倍。如果是这种情况,那么由于在进程中创建了两个单例实例,但单例实例指针最终指向其中一个,因此也可能会导致内存泄漏。

关于c++ - Windows 计时器有时会以两倍的速度运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36496421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com