Страницы

Поиск по вопросам

пятница, 9 ноября 2018 г.

Как вызвать функцию по завершении таймера?

Я удивлён, что не нашёл ничего вменяемого по этому вопросу. Но всё же, как в с++ вызвать некую функцию по завершении таймера? Вопрос достаточно банальный однако. Подозреваю, что тут не обойдётся без boost::bind. Нужен аналог данного: QTimer::singleShot(100, this, SLOT(onTimeExpired()));


Ответ

Озадачали Вы меня. Вот тут на досуге набросал что-то. #pragma once #include #include
namespace MyTimer {
class Timer { private: boost::shared_ptr thr;
template class _func { unsigned int dur; Callable& cb;
public: _func (long long _dur, const Callable& _cb): dur (_dur), cb((Callable&) _cb) {} void operator() () { boost::this_thread::sleep(boost::posix_time::milliseconds(dur)); cb(); } };
public: template Timer (long long _dur, const Callable& _cb) { _func ff (_dur, _cb); thr.reset (new boost::thread(ff)); }
~Timer() {}
Timer (const Timer& tm) { this->thr = tm.thr; }
Timer operator= (const Timer& tm) { if (this != &tm) this->thr = tm.thr; return *this; }
void interrupt () { thr->interrupt(); } };
} Это все оформляется в виде хедера. Используется очень просто. MyTimer::Timer Tm1 (5000, func); Первый параметр - время ожидания в миллисекундах, второй - вызываемый объект. Может быть простая функция, может быть функтор. Главное, не имеет параметров и возвращает void. Можно прервать ожидание с помощью метода interrupt() Испытывал в лине, gcc4.6 и 4.7 и icpc 12, boost 1.49 и 1.51

Комментариев нет:

Отправить комментарий