在我的项目中,我具有以下定义的功能:

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开始新的睡眠?

我怎样才能做到这一点?

最佳答案

移动并处置旧线程(来自移动设备,未经测试的代码)。如果线程要触发处理程序,则只需抛出一个被杀死的标志,这样一旦被杀死就不会触发已处置的线程。

 if(mThread != nullptr)
 {
     auto dispose = std::move(mThread);
     dispose->detach();
     mThread.reset(new Thread([&]()
    {
        sleep(std::chrono::milliseconds(mDelay));
    });
  }

07-24 13:37