Используя лямбда-обработчик boost с помощью deadline_timer

Я пытаюсь использовать повышение deadline_timer внутри лямбды, и хотя он работает как таймер с одним отключением, я не могу расширить таймер, не получив сообщение об ошибке 995 - "Операция ввода-вывода была прервана".

// Note the timer is not started yet.
if (gpGuiTimer) {
    // if we just enabled the dimming bar set the timer
    if (*green == SGL_TRUE) {
        // pet watchdog (canceling any existing timers)
        gpGuiTimer->expires_from_now(
            boost::posix_time::seconds(2));
        // Start the asynchronous timer
        gpGuiTimer->async_wait([&](const boost::system::error_code& ec) {
            if (ec != error::operation_aborted) {
                // UPDATE GUI CONTROL THAT TIMED OUT HERE
            } else if (ec.value() == 995) {
                // ERROR....
            }
        });
    } else {
        gpGuiTimer->cancel();
    }
}

Способ расширения таймера (пока он уже ожидает истечения срока действия существующего таймера) заключается в следующем:

// pet watchdog to prevent dimming bar timeout
gpGuiTimer->expires_from_now(
    boost::posix_time::seconds(2));

Я могу видеть, когда я делаю расширение watchdog выше, что лямбда-код вызывается с ec установлен в error::operation_aborted, Это ожидается, поскольку продление таймера приводит к отмене первого таймера и замене его на расширенный. Что я делаю неправильно?

Я создал объект IOService следующим образом (добавив рабочий объект, чтобы он не заканчивался, пока я не решу завершить работу.

gpIOService = std::make_unique<boost::asio::io_service>();
gpWorking = std::make_unique<boost::asio::io_service::work>(*gpIOService))
. . .
gpGuiTimer = std::make_unique<deadline_timer>(*gpIOService);
. . .

Служба IOS работает следующим образом и даже после ошибки 995 продолжает работать (предположительно, поскольку рабочий объект все еще занят)

std::thread([this]() {
    gpIOService->run();
}));

Из того, что я могу сказать из документации по deadline_timer, видно, что для продления таймера, когда он уже активен, мне, возможно, придется следовать рекомендациям, приведенным в разделе " Изменение срока действия активного deadline_timer", однако это фактически означает, что я буду Я должен иметь глобальный обработчик завершения, и я хотел бы сделать все из удобства простой лямбда на месте.

0 ответов

Другие вопросы по тегам