我正在尝试在lambda中使用boost deadline_timer,虽然它可以作为一个关闭计时器使用,但我似乎无法延长计时器而不会收到错误995 - ' I / O操作已中止' I / O操作已中止&#39 39 ;.
// 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));
我可以看到当我执行上面的监视程序扩展时,将ec
设置为error::operation_aborted
来调用lambda代码。这是预期的,因为延长计时器会导致第一个计时器被取消,并被扩展计时器取代。我做错了什么?
我按如下方式创建了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);
. . .
IOService运行如下,即使在995错误之后它继续运行(可能是因为工作对象仍然忙)
std::thread([this]() {
gpIOService->run();
}));
从我在deadline_timer文档中可以看出,似乎为了在计时器已经处于活动状态时对其进行扩展,我可能必须按照更改活动截止时间&#的部分遵循指南39; s到期时间,但这实际上意味着我必须拥有一个全局完成处理程序,我想从一个简单到位的lambda的方便中做所有事情。