Я сделал очень простой класс таймера с таймером и дал подводные камни вокруг кода МТ, я бы хотел проверить здравый смысл. Идея здесь состоит в том, чтобы начать поток, а затем непрерывно ждать цикла в переменной. Если время ожидания закончилось, интервал был превышен, и мы вызываем обратный вызов. Если переменная была указана, поток должен выйти, и мы не вызываем обратный вызов.Простой резьбовой таймер, проверка работоспособности
Одна из вещей, о которых я не уверен, - это то, что происходит в деструкторе с моим кодом, поскольку поток может быть соединен там (просто). Могу ли я присоединиться к потоку в деструкторе, чтобы убедиться, что он закончен?
Вот класс:
class TimerThreaded
{
public:
TimerThreaded() {}
~TimerThreaded()
{
if (MyThread.joinable())
Stop();
}
void Start(std::chrono::milliseconds const & interval, std::function<void(void)> const & callback)
{
if (MyThread.joinable())
Stop();
MyThread = std::thread([=]()
{
for (;;)
{
auto locked = std::unique_lock<std::mutex>(MyMutex);
auto result = MyTerminate.wait_for(locked, interval);
if (result == std::cv_status::timeout)
callback();
else
return;
}
});
}
void Stop()
{
MyTerminate.notify_all();
}
private:
std::thread MyThread;
std::mutex MyMutex;
std::condition_variable MyTerminate;
};
Я полагаю, лучше вопрос может быть попросить кого-нибудь мне точку к очень простому древовидному таймеру, если есть один уже есть где-то.
Чтобы быть точным, вызывается 'terminate'. Никакие исключения не выбрасываются. – Damon
@ Дамон ах, ты прав. Исправлена. – user2079303
Кажется, что это не работает. По какой-то причине результатом всегда является тайм-аут.Кажется, он никогда не сигнализируется и никогда не останавливается. Правильно ли это? notify_all должен разблокировать wait_for? – Robinson