2015-04-03 3 views
1

Я кодирую программу на C++ для взаимодействия с Интернетом с помощью C++ REST SDK. У меня есть основная функция и функция webCommunication. Код похож на ниже:C++ Function Completing Before Other Function Finishes

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(), все еще не добившись успеха.

+0

Проверьте REST SDK на функции, которые ждут окончания потока. –

ответ

0

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

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

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

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

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

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

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. 
    */ 
} 

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

int main() 
{ 
    HttpStreamingAsync(); 
    // Acquire lock to wait for complete 
    mutex.lock(); 
    system("PAUSE"); 
} 
+0

Я попытался создать mutex mutex, а затем заблокировал его после вызова моей функции httpRequest и разблокировки во время функции httpRequest. Однако он все еще не работает - функция httpRequest выполняет разблокировку до того, как она еще завершила httpRequest. Попытка положить разблокировку в разных местах и ​​все тот же результат. – Steven

+0

Возможно, если вы предоставите этот код, мы сможем его исправить. Во фрагменте, который я предоставил, разблокировка мьютекса НЕ выполняется до получения и обработки http_response. То есть вы должны видеть выходные данные длины контента и такие до релиза мьютекса. Вы также должны уметь спать прямо перед разблокировкой, чтобы проверить это или использовать отладчик с точками останова, чтобы увидеть, когда все происходит. – LawfulEvil