如何并行处理两个函数,每个函数以特定频率运行?



我想并行运行两个函数,每个函数具有不同的执行频率。

我使用了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实例,以便运行多个线程。

相关内容

最新更新