c++中CallBack函数的错误间隔计时器



我在网上找到这个类来实现一个回调函数,异步地做一些工作,而我在主线程上。这是类:

#include "callbacktimer.h"
CallBackTimer::CallBackTimer()
:_execute(false)
{}
CallBackTimer::~CallBackTimer() {
if( _execute.load(std::memory_order_acquire) ) {
stop();
};
}
void CallBackTimer::stop()
{
_execute.store(false, std::memory_order_release);
if( _thd.joinable() )
_thd.join();
}
void CallBackTimer::start(int interval, std::function<void(void)> func)
{
if( _execute.load(std::memory_order_acquire) ) {
stop();
};
_execute.store(true, std::memory_order_release);
_thd = std::thread([this, interval, func]()
{
while (_execute.load(std::memory_order_acquire)) {
func();
std::this_thread::sleep_for(
std::chrono::milliseconds(interval)
);
}
});
}
bool CallBackTimer::is_running() const noexcept {
return ( _execute.load(std::memory_order_acquire) &&
_thd.joinable() );
}

这里的问题是,如果我设置一个工作每毫秒完成一次,我不知道为什么,但它每64毫秒重复一次,而不是每1毫秒,这段代码明白了:

#include "callbacktimer.h"
int main()
{
CallBackTimer cBT;
int i = 0;
cBT.start(1, [&]()-> void {
i++;
});

while(true)
{
std::cout << i << std::endl;
Sleep(1000);
}
return 0;
}

在这里我应该看到标准输出:1000,2000,3000,等等。

在PC上以1ms的时间间隔做一些事情是相当困难的。线程调度发生在1/64s,约16ms。

当您尝试睡眠1毫秒时,它可能会睡眠1/64秒,而不是考虑到没有其他线程计划运行。当你的主线程休眠一秒钟时,你的回调计时器可能在这段时间内运行多达64次。

参见Windows每秒执行一次线程切换的频率?

您可以尝试多媒体计时器,它可能会下降到1毫秒。

我正在尝试在qt中实现一个计时器,它也应该显示微秒

嗯,你可以显示微秒,我猜。但是你的函数不会每微秒都运行。

最新更新