В настоящее время я использую libevent-2.0.5 в моей программе cpp (C ++ 11) для установки события таймера.
Кодовая логика выглядит так:
static void timer_cb(evutil_socket_t fd, short what, void *arg)
{
// do some checking
...
}
int main(int argc, char* argv[])
{
struct event *foo_timer;
...
// set up libvent timer to be executed every 1 second
foo_timer = event_new(base, -1, EV_TIMEOUT|EV_PERSIST, timer_cb, args);
event_add(foo_timer, &one_sec);
// dispatch event
...
}
Таким образом, функция обратного вызова будет выполняться каждые 1 сек.
Теперь мой вопрос, как я могу динамически изменить интервал?
Например, предположим, что есть другой поток, посылающий сигнал (не знаю, когда) на этот обратный вызов таймера, такой как установка bool flag
.
Я хочу добиться того, чтобы, когда обратный вызов обнаружил, что flag
равен true
, он может изменить временной интервал до 500 мс.
Таким образом, обратный вызов таймера будет выполнен через 500 мс после завершения текущего.
Я сейчас застрял здесь, потому что единственный возможный способ, который я узнаю, это удалить этот таймер и создать (добавить) новый.
как:
static void timer_cb(evutil_socket_t fd, short what, void *arg)
{
// do some checking
...
// create new event and remove the old one
if (flag)
{
// create new timer
bar_timer = event_new(base, -1, EV_TIMEOUT|EV_PERSIST, timer_cb, bar_timer);
event_add(bar_timer, &five_100ms);
// remove old one
old_event = (struct event *)args;
event_del(old_event);
}
}
int main(int argc, char* argv[])
{
struct event *foo_timer;
...
// set up libvent timer to be executed every 1s
foo_timer = event_new(base, -1, EV_TIMEOUT|EV_PERSIST, timer_cb, foo_timer);
event_add(foo_timer, &one_sec);
// dispatch
...
}
Но я получаю сбои после event_del(old_event);
Если я откажусь от event_del
, новое событие, похоже, не будет запущено.
Так что мне нужно какое-то предложение о том, как достичь своей цели, или я должен обратиться к некоторым другим библиотекам, чтобы достичь этого?