我的应用程序(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()时,永远不会调用timeout方法。使用run()它可以正常工作,但这会阻止执行。
答案 0 :(得分:2)
poll
函数仅运行准备在该时刻运行的处理程序。由于计时器还没有超时,它现在无法运行该处理程序。你问它不要阻止。那么你期望它做什么?
如果您的代码是线程安全的,请创建另一个可以在run
中阻止的线程。如果没有,则此线程必须返回并稍后调用poll
以便处理程序有机会运行。
一个警告:如果您确实创建了一个或多个run
个线程,则需要确保始终至少有一个要等待的事件,否则线程将无法等待处理程序。 boost::asio::io_service::work
就是出于这个目的。请参阅this question。
答案 1 :(得分:0)
如果你在超时之前调用poll,那么io_service poll将无需执行任何动作即可返回。在等待超时或外部设备通信时,您想要做什么?您可以运行循环,等待外部设备通信,轮询io_service并检查超时标志:
while (!checkForExternalDevicesCommunication())
{
io_svc.poll();
if (statusVariableHasTimeout())
throw CommunicationTimeoutException();
doSomethingInTheMeanTime();
std::this_thread::sleep(some_time);
}
或以异步方式实现与外部设备的通信,Boost.Asio样式并让它在同一个io_service上运行。