2013-11-21 62 views
1

我正在實施一些使用升壓asio操作, 我遇到了一個接口問題,我沒有收到'處理程序'初始化,但之後,避免繁忙的循環與提升:: asio :: io_service運行

這迫使我寫一個'忙'循環,我想要做的就是讓io_service運行,即使沒有至少一個處理程序,是否有可能?處理這個問題的方法是什麼?請在服務器上等待處理程序? 這是我的代碼..

/** : */ 
    void    Run   () { while(true) {m_srv.run(); Sleep(1);} } // once 1 handler is inside service, thread will not be in busy loop 
private: // members: 

    io_service m_srv; 

有什麼建議?感謝

這是代碼的問題:(m_drv是(io_service對象::運行..)經營提升任務::線程)

class App : public Base::Application 
{ 
public: 
    /** : */ 
    App(char* name, char* id) : Application(name, id), m_drv("NetTask"), m_worker("Worker"), m_acceptor(m_worker, Drv(), &OnAccept, 4567) 
    { 
     m_acceptor.Accept(Drv()); 
    } 

    /** : */ 
    inline DriverImp& Drv() { return static_cast<DriverImp&>(m_drv.Imp());} 

    /** : */ 
    inline Reactor& Worker() { return m_worker; } 
public: 
    APTR(Socket) m_sock; 
private: // members: 
    Driver  m_drv; 
    Reactor  m_worker; 
    Acceptor m_acceptor; 
}; 
+0

你的循環有一個小問題:['run']的文檔(http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service/run/overload1 .html)指出,如果'run'返回,你必須調用['reset'](http://www.boost.org/doc/libs/1_55_0/doc/html/booster_asio/reference/io_service/reset.html)再次調用'run'之前。 –

+0

我不想離開運行:),處理程序應該在開始後存在..但是,好的,我會查找它,仍然有什麼辦法來避免繁忙的循環? – Alon

+0

幾年前,我上次使用了Boost ASIO,現在我沒有我的源代碼,但是我記得我只是把'io_service.run()'調用放在它自己的線程中,並沒有沒有循環。我*認爲*它是在任何異步調用之前完成的,無論如何它都能正常工作。 –

回答

4

您需要使用io_service::work

boost::asio::io_service  service; 
boost::asio::io_service::work work(service); 

注意:在析構函數中work對象通知service工作已完成並且io_service::run()可能會返回。

+0

我同意,爲什麼我問:),做了工作,它仍然退出.. – Alon

+0

我不看看它有什麼用處,工作人員說,當沒有更多的處理人員時,它會結束,我不希望它完成 – Alon

+0

@Alon,對不起,沒有得到你。問題解決了嗎? –