使用带有deadline_timer的boost lambda完成处理程序

时间:2018-06-09 23:57:18

标签: c++ boost lambda boost-asio completionhandler

我正在尝试在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的方便中做所有事情。

0 个答案:

没有答案