加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 带有std :: thread和std :: chrono的基本计时器

发布时间:2020-12-16 03:35:54 所属栏目:百科 来源:网络整理
导读:我正在尝试使用经典方法实现基本计时器:start()和stop().我正在使用带有std :: thread和std :: chrono的c 11. 开始方法.创建一个在给定间隔时间内处于睡眠状态的新线程,然后执行给定的std :: function.当’running’标志为真时,重复此过程. 停止方法.只需将
我正在尝试使用经典方法实现基本计时器:start()和stop().我正在使用带有std :: thread和std :: chrono的c 11.

>开始方法.创建一个在给定间隔时间内处于睡眠状态的新线程,然后执行给定的std :: function.当’running’标志为真时,重复此过程.
>停止方法.只需将’running’标志设置为false即可.

我创建并启动了一个显示“Hello!”的Timer对象.每一秒,然后与其他线程我试图停止计时器,但我不能.计时器永不停止.

我认为问题在于th.join()[*]在线程完成之前停止执行,但是当我删除th.join()行时,程序显然在计时器开始计数之前完成.

所以,我的问题是如何在不停止其他线程的情况下运行线程?

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

class Timer
{
    thread th;
    bool running = false;

public:
    typedef std::chrono::milliseconds Interval;
    typedef std::function<void(void)> Timeout;

    void start(const Interval &interval,const Timeout &timeout)
    {
        running = true;

        th = thread([=]()
        {
            while (running == true) {
                this_thread::sleep_for(interval);
                timeout();
            }
        });

// [*]
        th.join();
    }

    void stop()
    {
        running = false;
    }
};

int main(void)
{
    Timer tHello;
    tHello.start(chrono::milliseconds(1000),[]()
    {
        cout << "Hello!" << endl;
    });

    thread th([&]()
    {
        this_thread::sleep_for(chrono::seconds(2));
        tHello.stop();
    });

    th.join();

    return 0;
}

输出:

Hello!
Hello!
...
...
...
Hello!

解决方法

在Timer :: start中,您在th中创建一个新线程,然后立即将其与th.join()连接.实际上,在生成的线程退出之前,start不会返回.当然,它永远不会退出,因为在开始返回之后,没有任何东西会设置为false.

在您打算等待它完成之前,请不要加入线程.在这种情况下,在设置running = false后停止可能是正确的位置.

另外 – 虽然它不是不正确的 – 没有必要在main中创建另一个线程来调用this_thread :: sleep_for.您可以使用主线程执行此操作:

int main()
{
    Timer tHello;
    tHello.start(chrono::milliseconds(1000),[]{
        cout << "Hello!" << endl;
    });

    this_thread::sleep_for(chrono::seconds(2));
    tHello.stop();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读