Добрый час.
Пытаюсь сделать простой пример асинхрнного вызова колбека из потока.
Набросал вот такой код, вроде работает, но есть пару проблем.
//combiner
struct async_combiner_t
{
typedef void result_type;
async_combiner_t(boost::asio::io_service * _io_ptr) : io_ptr(_io_ptr) {}
boost::asio::io_service * io_ptr;
template<typename InputIter>
void operator()(InputIter first, InputIter last)
{
for (InputIter i = first; i != last; ++i)
{
io_ptr->post([=]() { *i; });
}
}
};
//класс потока
struct thread_notifier_async
{
boost::asio::io_service io;
async_combiner_t async_combiner;
async_sig_t async_sig;
thread_notifier_async()
: async_combiner(&io)
, async_sig(async_combiner)
{}
void thread_func()
{
async_sig(20); //<-- асинхронно сигналим
sleep(100);
}
void connect(boost::function<void(int)> cb)
{
async_sig.connect(cb);
}
void run()
{
//создаем фиктивный worker что бы удержать io_service
boost::scoped_ptr<boost::asio::io_service::work> work_ptr(new boost::asio::io_service::work(io));
//запускаем поток
boost::thread th(boost::bind(&thread_notifier_async::thread_func, this));
io.run(); //<--тут собственно вечно висим... из-за этого самого воркера. Как разрешить?
th.join();
}
};
//запуск потока и callback
void test()
{
thread_notifier_async tn;
tn.connect([](int n) //<-- подписываемся на сигнал
{
n++;
});
tn.run();
}