首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程如何更改睡眠时间

线程如何更改睡眠时间
EN

Stack Overflow用户
提问于 2018-08-27 00:37:33
回答 3查看 129关注 0票数 1

在我的项目中,我有如下定义的函数:

代码语言:javascript
运行
复制
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开始一个新的睡眠。

我如何才能实现同样的目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-27 01:21:12

移动和处理旧线程(来自移动设备,代码未测试)。如果线程要触发一个处理程序,只需发出一个will标志,这样一旦被终止,就不会触发被释放的线程。

代码语言:javascript
运行
复制
 if(mThread != nullptr)
 {
     auto dispose = std::move(mThread);
     dispose->detach();
     mThread.reset(new Thread([&]()
    {
        sleep(std::chrono::milliseconds(mDelay));
    });
  }
票数 0
EN

Stack Overflow用户

发布于 2018-08-27 03:19:19

我知道你在做什么,我相信std::condition_variable就是你正在寻找的。

您可以调用wait_for来代替睡眠。当你想唤醒线程时,你可以调用notify_one

票数 2
EN

Stack Overflow用户

发布于 2018-08-27 00:55:14

首次创建线程后,在线程完成其工作后,mThread永远不会重置。下次调用start()时,mThread不再是nullptr,因此不会使用更新后的delay创建新线程。

要么Thread lambda需要在退出前将mThread重置为nullptr,要么Thread需要一个lambda可以在退出前设置的bool成员。无论采用哪种方式,start()都可以知道何时需要新线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52028260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档