В настоящее время я работаю с клиентом async rest, используя boost :: asio :: io_service. Я пытаюсь сделать клиента своего рода услугой для более крупной программы. Идея заключается в том, что клиент будет выполнять асинхронные HTTP-запросы в API останова независимо от потока, выполняющего основную программу. Таким образом, внутри в клиенте будет другой поток, ожидающий отправки запроса. Чтобы передать запросы клиента я использую io_service и io_service :: работа инициализированную io_service. Я почти повторил пример, приведенный в этом уроке - logger_service.hpp. Моя проблема заключается в том, что когда в примере они отправляют работу службе, вызываемый обработчик является простой функцией. В моем случае, когда я делаю асинхронные вызовы, как это (я необходимое сделать, чтобы запустить все instancies следующих объектов и еще некоторые таким образом, чтобы иметь возможность установить подключение к сети):boost async rest client
boost::asio::io_service io_service_;
boost::asio::io_service::work work_(io_service_); //to prevent the io_service::run() to return when there is no more work to do
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_(io_service_);
в основной программе я делаю следующие вызовы:
client.Connect();
...
client.Send();
client.Send();
...
псевдокод Some клиента:
void MyClass::Send()
{
...
io_service_.post(boost::bind(&MyClass::AsyncSend, this);
...
}
void MyClass::AsyncSend()
{
...
boost::io_service::asio::async_write(socket, streamOutBuffer, boost::bind(&MyClass::handle_send, this));
...
}
void MyClass::handle_send()
{
boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this));
}
void MyClass::handle_read()
{
// ....treatment for the received data...
if(allDataIsReceived)
FireAnEvent(ReceivedData);
else
boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this));
}
Как описано в документации 'post 'метод запрашивает io_service для вызова данного обработчика и немедленно возвращается. Мой вопрос в том, будут ли вложенные обработчики, например :: handle_send в AsyncSend, вызванный сразу после (когда ответ HTTP готов), когда используется post()? Или обработчики будут вызваны в другом порядке, отличном от того, который определяется порядком вызовов post()? Я задаю этот вопрос, потому что, когда я звоню только раз клиент-> Отправить(), клиент, кажется, «отлично работает». Но когда я делаю 2 последовательных вызова, как в приведенном выше примере, клиент не может завершить первый вызов, а затем выполняет второй, а после некоторых хаотических исполнений в конце 2 операции завершаются с ошибкой.
Есть ли способ сделать то, что я описываю, выполнить целую цепочку асинхронов до выполнения другого.
Я надеюсь, что я достаточно ясно с моим описанием :)
Вы можете сделать это синхронно или добавить переменную условия, чтобы проверить, закончился ли предыдущий вызов. (Предполагая, что вы правильно обрабатываете SSL-соединение) – Blacktempel