2013-08-31 76 views
1

我有以下的(最小化)類處理我的服務器連接:如何防止Boost :: Asio計時器阻止io_service :: run()的返回?

class AsioServer { 
protected: 
    boost::asio::io_service ioService; 
public: 
    AsioServer() {} 

    void add_request() { 
     //Adding async requests to the ioService 
    } 

    void timeout() { 
     //Stop all pedning async operations 
     ioService.stop(); 
    } 

    void perform() { 
     //Set a timer 
     boost::asio::deadline_timer timer(ioService); 
     timer.expires_from_now(boost::posix_time::seconds(5)); 
     timer.async_wait(std::bind(&AsioServer::timeout, this)); 

     //Performe all Async operations 
     ioService.run(); 
     ioService.reset(); 
    } 
}; 

我的問題是,期限計時器防止ioService.run()返回,直到它過期。我想要的是定時器僅在完成時取消並取消異步操作時調用,但在io_service的上下文中不作爲work。有沒有計時器作爲工作,或處理這種情況的另一種好方法?

+0

在單獨的線程中運行? –

+0

@JoachimPileborg:可能,但我認爲它會很難看,因爲在實際的代碼中,超時函數會做更多的事情。並調用'ioService.sop()'不會取消正在運行的處理程序,因此我將不得不使用大量的互斥體,我想避免。 – Haatschii

+0

'io_service'是調度定時器完成處理程序(以及其他asio對象處理程序)的工具 - 如果'io_service'在此之前退出,則沒有人會調用您的'timeout'函數! –

回答

1

io_service::run不退出(如果沒有明確停止),只要它有一些工作 - 這包括/任我完成處理O對象和定時器,因爲io_service是調度所有這些處理程序負責。

如果您不希望計時器在套接字I/O操作完成後再等待 - 只需要cancel()計時器或重新計劃它(如果適用)。你可以找到這樣的方法in asio examples

相關問題