我正在尝试使用经典方法来实现一个基本计时器:start() 和 stop()。我将 c++11 与 std::thread 和 std::chrono 一起使用。
- 启动方法。创建一个在给定间隔时间内休眠的新线程,然后执行给定的 std::function。当“正在运行”标志为真时,重复该过程。
- 停止方法。只需将“正在运行”标志设置为 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;
}
Output:
Hello!
Hello!
...
...
...
Hello!
In Timer::start
,您创建一个新线程th
然后立即join
它与th.join()
。有效地,start
在生成的线程退出之前不会返回。当然,它永远不会退出,因为直到之后才将运行设置为 falsestart
返回...
Don't join
一个线程,直到您打算等待它完成。在这种情况下,在stop
设置后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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)