在我的项目中,我有如下定义的函数:
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开始一个新的睡眠。
我如何才能实现同样的目标?
发布于 2018-08-27 01:21:12
移动和处理旧线程(来自移动设备,代码未测试)。如果线程要触发一个处理程序,只需发出一个will标志,这样一旦被终止,就不会触发被释放的线程。
if(mThread != nullptr)
{
auto dispose = std::move(mThread);
dispose->detach();
mThread.reset(new Thread([&]()
{
sleep(std::chrono::milliseconds(mDelay));
});
}发布于 2018-08-27 03:19:19
我知道你在做什么,我相信std::condition_variable就是你正在寻找的。
您可以调用wait_for来代替睡眠。当你想唤醒线程时,你可以调用notify_one。
发布于 2018-08-27 00:55:14
首次创建线程后,在线程完成其工作后,mThread永远不会重置。下次调用start()时,mThread不再是nullptr,因此不会使用更新后的delay创建新线程。
要么Thread lambda需要在退出前将mThread重置为nullptr,要么Thread需要一个lambda可以在退出前设置的bool成员。无论采用哪种方式,start()都可以知道何时需要新线程。
https://stackoverflow.com/questions/52028260
复制相似问题