2017-02-27 164 views
2

我用用async_read_some這個代碼與超時升壓ASIO async_read_some超時

 readdata=0; 
     port_->async_read_some(boost::asio::buffer(vector), 
       boost::bind(readCallback)); 


     //init async timer 
     boost::asio::deadline_timer timer(io); 
     timer.async_wait(boost::bind(timeoutHandler)); 
     timer.expires_from_now(boost::posix_time::seconds(5)); 

     io.reset(); 
     do { 
      io.run_one(); 
     } 
     while (readdata==0); 

這裏是我的回調

void readCallback() 
{ 
    std::cout << "READ CALLBACK: "<<x<<std::endl; 
    readdata=1; 
    return; 
} 
void timeoutHandler() 
{ 
    std::cout << "TIMEOUT CALLBACK: "<<x<<std::endl; 
    readdata=1; 
} 

我的問題是,timeoutHandler是在5秒後立即和不執行

+0

自從我使用asio以來已經有一段時間了,但是當你移除'io.reset()'時會發生什麼?它可能導致'async_wait'重置 –

+0

就像@SteveVanOpstal所說的那樣,你應該移除'io.reset()'。您將任務添加到異步事件處理程序(io_service)中,然後在運行將執行您添加的事件(您使用'run_one()'執行的)的服務之前立即重置它。我建議你閱讀並學習更多關於'io_service'和它是如何工作的。 –

+0

謝謝,我試過了,但結果相同,即時調用'timeoutHandler()' – user2071938

回答

1

簡單的錯誤。在致電async_wait之前,您應該先做expires_from_now

#include <iostream> 
#include <asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

int main() { 
    asio::io_service io_s; 
    asio::deadline_timer timer(io_s); 
    timer.expires_from_now(boost::posix_time::seconds(5)); 
    timer.async_wait([](auto err_c) { std::cout << "After 5 seconds" << std::endl; }); 

    io_s.reset(); 

    io_s.run(); 

    return 0; 
}