在我的项目中,我具有以下定义的功能:
void start(std::chrono::milliseconds delay) override
{
mDelay = delay;
if(mThread == nullptr)
{
mThread = std::make_unique<Thread>([&]()
{
sleep(std::chrono::milliseconds(mDelay));
});
}
}
当我第一次调用该方法时,将创建线程并在mDelay周期内进入睡眠状态。但是我需要再次更改mDelay时间,但是更改的时间要比提供的更早。
但是当我再次调用它时,我无法取消先前的睡眠并使用定义的mDelay开始新的睡眠吗?
我怎么能达到同样的目的?
答案 0 :(得分:2)
我明白了您要做什么,我相信std::condition_variable
是您要寻找的东西。
您可以致电wait_for
而不是睡觉。当您想唤醒线程时,可以调用notify_one
。
答案 1 :(得分:1)
第一次创建线程后,mThread
永远不会在线程完成其工作后重置。下次调用start()
时,mThread
不再是nullptr
,因此不会使用更新的delay
创建新线程。
要么Thread
lambda需要在退出前将mThread
重置为nullptr
,否则Thread
需要一个bool
成员,lambda可以在退出前设置。两种方法都可以让start()
知道何时需要新线程。
答案 2 :(得分:0)
移动并处置旧线程(来自移动设备,未经测试的代码)。如果该线程要触发处理程序,则只需引发一个killed标志,以使处置的线程一旦被杀死就不会触发。
if(mThread != nullptr)
{
auto dispose = std::move(mThread);
dispose->detach();
mThread.reset(new Thread([&]()
{
sleep(std::chrono::milliseconds(mDelay));
});
}