我想并行运行两个函数,每个函数具有不同的执行频率。
我使用了CppTime::Timer,但我意识到,这些函数实际上是在彼此后面执行的。这是因为CppTime
彼此后面执行线程,还是我的代码有问题?
这里是脚本:
CppTime::Timer timer;
std::vector<CppTime::timer_id> timer_id;
timer_id.push_back(timer.add(std::chrono::seconds(0), &longProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_slow))));
timer_id.push_back(timer.add(std::chrono::seconds(0), &shortProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_high))));
是否有人知道错误,或者有人有比CppTime更合适的解决方案?
编辑: 一个进程应该在1Hz
下运行(大约需要0.5s
个)。另一个进程应该在10Hz
运行(只需要几个ms
)。如果它们不并行运行,并且10Hz
过程在0.5s
后开始,则没有问题。
添加计时器回调时,语句longProcess()
和shortProcess()
将尝试调用这些函数,然后将返回值传递给add()
。 因此,直到longProcess()
完成工作并退出后,才会执行第一个timer.add()
。 与第 2timer.add()
和shortProcess()
相同.
假设代码甚至可以编译,假设add()
期望与handler_t
签名匹配的回调,定义为std::function<void(timer_id)>
,但您调用回调时没有任何参数。
将回调函数传递给add()
时去掉括号:
void longProcess(CppTime::timer_id)
{
...
}
void shortProcess(CppTime::timer_id)
{
...
}
...
CppTime::Timer timer;
std::vector<CppTime::timer_id> timer_id;
timer_id.push_back(timer.add(std::chrono::seconds(0), &longProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_slow))));
timer_id.push_back(timer.add(std::chrono::seconds(0), &shortProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_high))));
话虽如此,从实际实现来看,CppTime::Timer
类在内部运行单个工作线程。 它将添加的计时器存储在排序的向量中,并且只是在连续循环中循环该向量,在其时间段过后执行每个处理程序。 因此,添加多少计时器并不重要,它们的处理程序将始终相对于彼此按顺序执行。 因此,要执行您正在尝试的操作,您需要将处理程序分成多个CppTime::Timer
实例,以便运行多个线程。