c++ - 使用 C++ 在超时后重置变量

标签 c++ boost

我的应用程序(C++、Windows)正在与外部设备通信。如果设备在一段时间后没有应答,我想重置一个状态变量。

我最初的做法是

auto timer = boost::asio::deadline_timer(io_svc);

timer.expires_from_now(boost::posix_time::seconds(10));
timer.async_wait(boost::bind(&Class::CurrRequestTimeout, this, boost::asio::placeholders::error));

io_svc.poll();

和超时函数

void Class::CurrRequestTimeout(const boost::system::error_code & ec)
{
    if (ec)
    {
        // this timeout was canceled
        return;
    }
    ResetStatusVariable();
}

这应该是非阻塞的,这就是我选择 poll() 而不是 run() 的原因(参见 here )。但是,使用 poll() 永远不会调用超时方法。使用 run() 它工作得很好,但这会阻止执行。

最佳答案

poll 函数只运行准备好在那一刻运行的处理程序。由于计时器尚未超时,因此它现在无法运行该处理程序。你要求它不要阻止。那么您希望它做什么?

如果您的代码是线程安全的,请创建另一个可以在run 中阻塞的线程。如果没有,则此线程必须返回并稍后调用 poll 以使处理程序有机会运行。

一个警告:如果您确实创建了一个或多个run 线程,您需要确保始终至少有一个事件要等待,否则线程将无法等待处理程序。 boost::asio::io_service::work 就是为了这个目的。参见 this question .

关于c++ - 使用 C++ 在超时后重置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562588/

相关文章:

C++ Boost::filesystem::path with unicode 字符

c++ - 当父类(super class)持有指向 X 的指针,子类持有 Y : X

c++ - 错误 : expected identifier before string constant or error: 'perf' is not a type

c++ - 如何在线程中初始化一个对象,然后在其他地方使用它?

c++ - 复制 boost::function 是否也复制闭包?

c++ - 异步线程间通信

c++ - 从可变参数创建链接列表

c++ - 返回 'auto' 的函数在定义之前不能使用

python - 使用 python3 为 msvc 构建 boost python - 链接器错误

c++ - Boost asio接收指定大小的数据