используя лямбда-обработчик 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …