2013-11-21 3 views
1

Я выполняю некоторые операции asio с помощью boost, Я столкнулся с проблемой интерфейса, с которой я не получаю «обработчики» при инициализации, но сразу после,Избегайте цикла занятости с boost :: asio :: io_service run

Это заставляет меня писать цикл «занят», что бы я хотел сделать, это запустить 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' return, вы должны вызвать [' reset'] (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_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

@ Алон, извините, вас не достали. Решена ли проблема? –

Смежные вопросы