Как избежать занятого цикла с помощью boost::asio::io_service run
Я реализую некоторые операции ASIO с использованием Boost, я столкнулся с проблемой интерфейса, который я не получаю "обработчики" при инициализации, но сразу после,
Это вынуждает меня написать цикл "занят", что я хотел бы сделать, чтобы 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 - это задача, которая работает с boost::thread(io_service::run..))
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;
};
1 ответ
Решение
Вам нужно использовать io_service:: work:
boost::asio::io_service service;
boost::asio::io_service::work work( service );
Примечание: в деструкторе work
объект уведомляет service
что работа завершена и io_service::run()
может вернуться.