背景
我目前正在为树莓派开发一个使用 C++11 的程序。基本设计(与这个问题相关)是:
- 我有一个等待来自外部源的命令的主循环。
- 在主循环中,我创建了一个代理(在单独的线程中运行的对象),它一直处于休眠状态,直到将某些内容添加到其队列中,在这种情况下,它会唤醒,处理该项目,然后再次检查队列中是否有任何项目重新进入睡眠状态(如果还有更多需要处理,则重复此过程)
在该项目的“处理”中,我只是在 X 秒内一次启用/禁用一个 GPIO 引脚。
处理伪代码:
for (Pin pin : pins)
{
set_pin(pin, HIGH);
this_thread::sleep_for(chrono::seconds(x))
set_pin(pin, LOW);
this_thread::sleep_for(chrono::seconds(y))
}
显然,该线程 99.999% 的时间都将用于睡眠(它执行代码的唯一时间是设置引脚输出时(此处未触及数据)
问题
我应该如何从主线程取消当前项目的处理?我不想杀死线程,我只想让它返回到它的运行循环以处理队列中的下一个项目(或回到睡眠状态)。
我可以想办法做到这一点,我只是想听听社区的一些想法并选择最佳解决方案。
附加代码
这是在单独线程中运行的类,用于处理队列中的项目。
schedule->RunSchedule(schedule)
是对上面伪代码描述的函数的调用。
调度线程.cpp
#include "ScheduleThread.h"
ScheduleThread::ScheduleThread()
: thread(&ScheduleThread::run, this)
{
}
ScheduleThread::~ScheduleThread() {
// TODO Auto-generated destructor stub
}
void ScheduleThread::QueueSchedule(Schedule *schedule)
{
lock_guard<mutex> lock(m);
schedule_queue.push(schedule);
stateChangedSema.post();
}
bool ScheduleThread::scheduler()
{
if (!schedule_queue.empty())
{
Schedule *schedule = schedule_queue.front();
schedule->RunSchedule();
schedule_queue.pop();
return true;
}
return false;
}
void ScheduleThread::run()
{
for(;;)
{
stateChangedSema.wait();
while (scheduler());
}
}
提前感谢您的帮助。