Я пытаюсь использовать повышение 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, однако это фактически означало бы, что у меня должен быть глобальный обработчик завершения, и я хотел бы сделать все из удобства простой лямбды на месте.
Задача ещё не решена.
Других решений пока нет …