Нужно предложение по динамически меняющемуся событию таймера с libevent - PullRequest
1 голос
/ 17 мая 2019

В настоящее время я использую 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, новое событие, похоже, не будет запущено.

Так что мне нужно какое-то предложение о том, как достичь своей цели, или я должен обратиться к некоторым другим библиотекам, чтобы достичь этого?

...