Завершение функции 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");
}