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

c – 带有std :: thread和std :: chrono的基本计时器,第1张

概述我正在尝试使用经典方法实现基本计时器:start()和stop().我正在使用带有std :: thread和std :: chrono的c 11. >开始方法.创建一个在给定间隔时间内处于睡眠状态的新线程,然后执行给定的std :: function.当’running’标志为真时,重复此过程. >停止方法.只需将’running’标志设置为false即可. 我创建并启动了一个显示“Hello! 我正在尝试使用经典方法实现基本计时器: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();}
总结

以上是内存溢出为你收集整理的c – 带有std :: thread和std :: chrono的基本计时器全部内容,希望文章能够帮你解决c – 带有std :: thread和std :: chrono的基本计时器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257052.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存