Завершение функции C++ до завершения других функций

Я пишу C++ программу для взаимодействия с Интернетом, используя C++ REST SDK. У меня есть основная функция и функция веб-связи. Код похож на ниже:

 void webCommunication(data, url)
 {
 //Communicate with the internet using the http_client
 //Print output
 }

 int main()
 {
 //Obtain information from user
 webCommunication(ans1, ans2);
 system("PAUSE");
 }

Тем не менее, похоже, что основная функция выполняется до завершения функции webCommunication. Если я сделаю webCommunication тип функции строки и

cout << webCommunication(ans1, ans2) << endl;

Но это все еще делает паузу и затем печатает полученные данные. Обычно это было бы хорошо, ожидайте, что я обращаюсь к возвращенному ответу позже в коде. Если веб-коммуникация не завершена, приложение вылетает. Есть ли какая-нибудь функция wait_until, которую я могу использовать?

ОБНОВЛЕНИЕ: я попытался использовать предложенный мьютекс, но безуспешно. Я также попытался запустить функцию как поток, а затем с помощью.join() все еще безуспешно.

2 ответа

Решение

Если вы объявите свою функцию webCommunications() как

pplx::task<void> webCommunications()
{
}

Тогда вы можете использовать.wait() при вызове функции. Затем он будет ждать, пока функция не выполнится, чтобы продолжить. Выглядит так:

pplx::task<void> webCommunications()
{
}

int main()
{
webCommunications().wait();
//Do other stuff
}

Я думаю, что вам не хватает ключевого слова в описании. АСИНХРОННЫЙ. Это указывает на то, что он возвращается до окончания. Если вам нужно, чтобы он был синхронным, вы должны поместить получение семафора сразу после вызова и добавить выпуск в код обратного вызова.

https://msdn.microsoft.com/en-us/library/jj950081.aspx

Измененный фрагмент кода по ссылке выше (добавлена ​​блокировка обратного вызова):

// Creates an HTTP request and prints the length of the response stream.
pplx::task<void> HTTPStreamingAsync()
{
    http_client client(L"http://www.fourthcoffee.com");

    // Make the request and asynchronously process the response. 
    return client.request(methods::GET).then([](http_response response)
    {
        // Print the status code.
        std::wostringstream ss;
        ss << L"Server returned returned status code " << response.status_code() << L'.' << std::endl;
        std::wcout << ss.str();

        // TODO: Perform actions here reading from the response stream.
        auto bodyStream = response.body();

        // In this example, we print the length of the response to the     console.
        ss.str(std::wstring());
        ss << L"Content length is " << response.headers().content_length() << L" bytes." << std::endl;
        std::wcout << ss.str();

        // RELEASE lock/semaphore/etc here.
        mutex.unlock()
    });

    /* Sample output:
    Server returned returned status code 200.
    Content length is 63803 bytes.
    */
}

Примечание. Получите мьютекс после вызова функции, чтобы начать веб-обработку. Добавьте к коду обратного вызова, чтобы освободить мьютекс. Таким образом, основной поток блокируется до тех пор, пока функция не завершится, а затем продолжит "паузу".

int main()
{
    HttpStreamingAsync();
    // Acquire lock to wait for complete
    mutex.lock();
    system("PAUSE");
}
Другие вопросы по тегам