我编写了一个运行速度不够快的
timercallback
类:
class Manager
{
...
void CallFunction(Function<Treturn>* m_function)
{
do
{
if (m_Status == TimerStatus::Paused)
{
unique_lock<mutex> lock(m_MutexLock);
m_Notifier.wait(lock);
}
while (m_Status != TimerStatus::Stoped&&m_Status != TimerStatus::Paused)
{
unique_lock<mutex> lock(m_MutexLock);
m_Notifier.wait_for(lock, m_Interval);
(*m_function)();
}
} while (m_Status == TimerStatus::Paused);
}
...
}
当我设置timercallback的时间为每1ms调用一次该函数时,它不起作用。需要更多时间,例如 10 毫秒。我需要帮助改进代码,以 1 毫秒的间隔调用回调函数(此计时器的事件函数),并在一个带锁的线程中运行。我该怎么做?
该类的使用示例:
Manager tester;
TimerCallback<microseconds> m_timer(chrono::microseconds(10), Core::Utility::ptr_fun(&tester, &Manager::runner));
您正在尝试使用
wait_for()
函数作为计时器,这确实不是拥有高精度计时器的好方法。不过,如果您需要互斥量功能,那么这几乎就是您所能得到的。
ppoll()
。该函数也可以在没有任何事件的情况下使用,只需一个超时,然后它就可以用作计时器。
nanosleep()
函数。这比 ppoll()
调用简单得多,因为您只需要一个 timespec
结构:
struct timespec t = { .tv_sec = 0, .tv_nsec = 1'000'000 };
nanosleep(&t);
旁注:
根据我使用 VirtualBox 的经验,虚拟机时钟精度非常糟糕。换句话说,在这样的系统上,您不太可能在调用之间获得可靠的 1 毫秒睡眠。我不知道这是否适用于基于云的虚拟机(它可能使用比 VirtualBox 更好的解决方案,但计时器的情况可能类似)。