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’标志为真时,重复此过程. 我创建并启动了一个显示“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# – “a”不包含“b”的定义,没有扩展方法’b’接受类型的
- ruby – 在Capistrano 3中永久切换用户(单独授权和部署)
- objective-c – 如何将UIImage添加到分组的UITableViewCell
- React-music 全家桶项目
- Flex:Web报表引擎——MyReport 2.6.4.0新功能
- Oracle PL/SQL – 使用自定义SQLERRM提高用户定义的异常
- HttpClientUtil通过xml和form表单方式请求
- 重构 — 改善既有的类图设计 条款16:每个类只包含两个聚合
- day14
- Oracle11g在windows 2008 R2 安装时提示 ORA-00336错误