2013-11-21 5 views
1

부스트를 사용하여 일부 asio 작업을 구현하고 있습니다. 인터페이스 문제가 발생했습니다. 누가 초기화 작업에서 '처리기'를받지 못했지만, 바로 다음에boost :: 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; 

어떤 제안을 내 코드? 감사

이 코드의 문제 : 당신은 사용할 필요가

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/boost_asio/reference/io_service/reset.html)를 호출해야한다고 말합니다. 'run'을 다시 호출하기 전에. –

+0

나는 실행을 떠나고 싶지 않다. :), 핸들러는 시작 후에 존재해야만한다. 그러나 ok, 나는 그것을 찾을 것이다. 아직도 바쁜 루프를 피하는 방법은 무엇인가? – Alon

+0

Boost ASIO를 마지막으로 사용한 이래로 2 년 전이었습니다. 지금은 소스를 사용할 수 없지만,'io_service.run()'호출을 자체 스레드에 넣었습니다. 그리고 didn 루프가 없습니다. 나는 비동기 호출이 만들어지기 전에 완료되었다고 생각하며, 어쨌든 잘 동작했다. –

답변

4

(m_drv 부스트 작동하는 작업 :: 스레드 (io_service :: 실행 ..)입니다) 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, 죄송합니다, 당신을 얻지 못했습니다. 문제가 해결 되었습니까? –