2013-11-21 26 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,对不起,没有得到你。问题解决了吗? –