boost asio: создание асинхронный клиентских соединений
От: derlih  
Дата: 25.01.11 10:03
Оценка:
Здравствуйте!

Столкнулся со следующей проблемой: не работают новые асинхронные клиенты, созданные после io_service::run.

Для примера я взял асинхронный http клиент прямо с буста (boost async HTTP client) и немного поменял, чтобы продемонстрировать проблему.

Мой код лежит здесь

Изменения только в самом конце. В отличие от оригинала, я создаю thread, в котором в вечном цикле запускается io_service::run. Один клиент создается до первого запуска run и работает. Второй после — и он не работает.

Все это я выполняю на ubuntu, boost 1.45.

Спасибо за помощь.
boost asio c++ async
Re: boost asio: создание асинхронный клиентских соединений
От: Аноним  
Дата: 25.01.11 10:42
Оценка:
> я создаю thread, в котором в вечном цикле запускается io_service::run.
Цикл не вечный. Он заканчиваеися когда заканчиваются все асинхронные калбэки.
Re[2]: boost asio: создание асинхронный клиентских соединени
От: derlih  
Дата: 25.01.11 10:50
Оценка:
Здравствуйте, Аноним, Вы писали:

>> я создаю thread, в котором в вечном цикле запускается io_service::run.

А>Цикл не вечный. Он заканчиваеися когда заканчиваются все асинхронные калбэки.

Да, но в моем коде он вызывается так:
void worker()
{
    for(;;)
    {
        try
        {
            io_service.run();
        }
        catch (...)
        {
            break;
        }
    }
}
Re: boost asio: создание асинхронный клиентских соединений
От: savitar  
Дата: 25.01.11 11:15
Оценка:
Здравствуйте, derlih, Вы писали:

в твоем случае io_service.run() нужно предварять io_service.reset(), а вообще это как-то неправильно вызывать в цикле io_service.run(), если есть что деалать оно там и так будет висеть, если нет для этого есть io_service::work
Re[3]: boost asio: создание асинхронный клиентских соединени
От: blackhearted Украина  
Дата: 25.01.11 11:17
Оценка:
Здравствуйте, derlih, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


>>> я создаю thread, в котором в вечном цикле запускается io_service::run.

А>>Цикл не вечный. Он заканчиваеися когда заканчиваются все асинхронные калбэки.

D>Да, но в моем коде он вызывается так:

D>
D>void worker()
D>{
D>    for(;;)
D>    {
D>        try
D>        {
D>            io_service.run();
D>        }
D>        catch (...)
D>        {
D>            break;
D>        }
D>    }
D>}
D>


точно-точно исключений нет?
Re[2]: boost asio: создание асинхронный клиентских соединени
От: derlih  
Дата: 25.01.11 13:36
Оценка:
Здравствуйте, savitar, Вы писали:

S>Здравствуйте, derlih, Вы писали:


S>в твоем случае io_service.run() нужно предварять io_service.reset(), а вообще это как-то неправильно вызывать в цикле io_service.run(), если есть что деалать оно там и так будет висеть, если нет для этого есть io_service::work


Спасибо! Это помогло

По поводу work'а не понятно, в каком потоке оно будет жить. В доке не нашел, к сожалению...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.