wait — Завершение функции 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
}
1

Другие решения

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

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");
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector