Страницы

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

пятница, 20 декабря 2019 г.

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

#таймер #cpp #функции


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


Ответы

Ответ 1



Озадачали Вы меня. Вот тут на досуге набросал что-то. #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

Ответ 2



Простейший вариант : #include void sighandler(int signum) { // Что-то делаем по прерыванию от таймера }; int main () { // Устанавливаем обработчик прерывания signal(SIGALRM, sighandler); // Задаём интервал 5 секунд alarm(5); }

Ответ 3



Вы функцию через заданное время хотите вызвать? Если в *nix, то посмотрите на man-ы timer_create, timer_delete, timer_settime, timer_gettime. Это "POSIX (interval) timers" В убунте (думаю в других тоже) в man timer_create есть пример. Можно одновременно делать несколько таймеров, которые могут быть "одноразовыми" (one short) или переодически срабатывающими. Время можно задавать как реальное, так и виртуальное (время процесса или потока). Интервал времени задается в секундах и наносекудах(!) (IMHO этим нано верить нельзя, но миллисекунды в моих тестах отрабатывались). Если интересно, могу выложить кусок кода, правда в нем вместо вызова функции посылается сигнал определенному потоку (что делать по истечении таймера - сигнал или вызов функции, задается в timer_create).

Ответ 4



Я честно не знаю "аналога", но если уж совсем ничего, то к вопросу: как в с++ вызвать некую функцию по завершении таймера? могу предложить вот такой вот недокод ;) : #include #include /* _beginthread, _endthread */ #include "Windows.h" typedef void(*run_func)(); class singleShot { public: singleShot(_time_out, run_func _func, bool run_now = true) : time_out(_time_out), func(_func) { if (run_now) run(); } static void thread_func( void *ch ) { singleShot* obj = static_cast(ch); Sleep(obj->time_out); obj->func(); _endthread(); } void run() {_beginthread(thread_func, 0, (void*)this);} void set_params(_time_out, run_func _func) {time_out=_time_out; func=_func;} int time_out; run_func func; }; void MyTimeOutFunc(); singleShot SecondUse(0, 0, false); int main(int argc, char* argv[]) { singleShot FirstUse(1000, MyTimeOutFunc); //можно и так использовать, главное не дать //удалиться объекту до выполнения функции : Sleep(2000); //Лучьше так: SecondUse.set_params(2000, MyTimeOutFunc); SecondUse.run(); system("Pause"); return 0; } void MyTimeOutFunc() { printf("\nHello world!!!\n"); }

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

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