Помогите разобраться [boost::asio, boost::signals2]
От: nen777w  
Дата: 23.08.18 13:28
Оценка:
Добрый час.
Пытаюсь сделать простой пример асинхрнного вызова колбека из потока.
Набросал вот такой код, вроде работает, но есть пару проблем.

//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();
}
Re: Помогите разобраться [boost::asio, boost::signals2]
От: nen777w  
Дата: 23.08.18 13:35
Оценка:
N>Добрый час.
N>Пытаюсь сделать простой пример асинхрнного вызова колбека из потока.
N>Набросал вот такой код, вроде работает, но есть пару проблем.

Разрешил сделав work_ptr членом класса и освободив его в функции потока.
Но хотелось бы всеравно узнать мнение, может есть способ реализовать это попроще.
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.