【发布时间】:2015-12-14 20:53:03
【问题描述】:
我有一个名为 read_packet 的函数。当没有连接请求或定时器发出信号时,此函数保持阻塞状态。
代码如下:
std::size_t read_packet(const std::chrono::milliseconds& timeout,
boost::system::error_code& error)
{
// m_timer_ --> boost::asio::high_resolution_timer
if(!m_is_first_time_) {
m_is_first_time = true;
// Set an expiry time relative to now.
m_timer_.expires_from_now( timeout );
} else {
m_timer_.expires_at( m_timer_.expires_at() + timeout );
}
// Start an asynchronous wait.
m_timer_.async_wait(
[ this ](const boost::system::error_code& error){
if(!error) m_is_timeout_signaled_ = true;
}
);
auto result = m_io_service_.run_one();
if( !m_is_timeout_signaled_ ) {
m_timer_.cancel();
}
m_io_service_.reset();
return result;
}
该功能在未收到连接请求时正常工作。所有请求的接受都是异步的。
在接受连接后,run_one() 函数不会在定时器设置的时间内保持阻塞状态。该函数始终返回 1(已处理一个句柄)。这个句柄对应定时器。
我不明白为什么会出现这种情况。
为什么功能没有阻塞定时器所需的时间?
干杯。
注意:此函数在循环中使用。
更新:
我有自己的io_service::run() 函数。此函数执行其他操作和任务。我想在一段时间内监听和处理网络级别:
-
如果网络级别出现问题,
io_service::run_one()返回并且 read_packet() 将控制权返回给我的 run() 函数。 否则,定时器被触发,read_packet() 将控制权返回给我的 run() 函数。
来自网络级别的所有内容都存储在数据结构中。然后我的 run() 函数对该数据结构进行操作。 它还运行其他选项。
void run(duration timeout, boost::system::error_code& error)
{
time_point start = clock_type::now();
time_point deadline = start + timeout;
while( !stop() ) {
read_packet(timeout, error);
if(error) return;
if(is_timeout_expired( start, deadline, timeout )) return;
// processing network level
// other actions
}
}
在我的情况下,套接字始终处于活动状态,直到客户端请求关闭连接。
在一个时间段内,您管理网络级别,而对于另一个时间段,您可以做其他事情。
【问题讨论】:
-
你为什么运行
run_one,而不是run?看起来您只等待一次,为什么您希望计时器运行多次? -
@sehe :我有一个异步接受器。因此,
io_service::run()函数始终被阻止。在等待连接时,我想做其他任务。计时器允许我这样做。 -
请看一些样本。看起来你在逆流划船。您可以同时使用线程来处理 IO 或发布任务来处理响应式任务吗?此外,这听起来完全矛盾。如果您同时使用计时器来回调您的wiel,那么运行不返回有什么问题?计时器仍会触发
-
在我的代码中,我不能使用线程。问题是计时器没有触发。
-
我认为你过于复杂了。这没有意义。让我告诉你:livecoding.tv/sehe
标签: c++ c++11 boost timer boost-asio