Я пытаюсь реализовать базовый таймер с помощью классических методов: start() и stop(). Я использую С++ 11 с std::thread и std::chrono.
- Метод запуска. Создает новый поток, который бездействует в течение заданного интервала времени, а затем выполняет указанную функцию std::function. Этот процесс повторяется до тех пор, пока установлен флаг «работает».
- Метод остановки. Просто устанавливает флаг «работает» в false.
Я создал и запустил объект Timer, который показывает «Hello!» каждую секунду, затем другим потоком я пытаюсь остановить таймер, но не могу. Таймер никогда не останавливается.
Я думаю, что проблема связана с 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!