У меня была похожая проблема с приложением win32, которое ожидало ответа от веб-службы с использованием API cpprest (Касабланка). Мое решение состояло в том, чтобы создать событие и поток, который делает только ожидание API cpprest, а затем освободить поток, как только он получит сигнал:
DWORD WINAPI WaitForCasablanca(LPVOID n)
{
// Get the handler to the event for which we need to wait in
// this thread.
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS, false, "MyEvent");
if (!hEvent) { return -1; }
// Loop through and wait for an event to occur
// Wait for the Event
WaitForSingleObject(hEvent, INFINITE);
// No need to Reset the event as its become non signaled as soon as
// some thread catches the event.
CloseHandle(hEvent);
return 0;}
BOOL WINAPI DlgProc(HWND hDlg, UINT message, WPARAM,wParam, LPARAM lParam) ...
HANDLE hEvent = CreateEvent(NULL, false, false, "MyEvent");//create an event that will wait for casablanca ro authenticate
if (!hEvent) return -1;
// Create a Thread Which will wait for the events to occur
DWORD Id;
HANDLE hThrd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WaitForCasablanca, 0, 0, &Id);
if (!hThrd) { CloseHandle(hEvent); return -1; }
makeCasablancaRequest(...);
SetEvent(hEvent); //casablanca has finished signal the event to terminate
WaitForSingleObject(hThrd, INFINITE); //wait for thread to die
CloseHandle(hThrd);
CloseHandle(hEvent);
...}
Это избавило меня от сообщения "программа не отвечает". Я полагаю, что проблема в том, что код, который получает данные, работает и в потоке - только основная программа не знает этого - поэтому, что касается системы, основная программа работает вхолостую. Вам нужно событие и поток, который ожидает события, чтобы сообщить системе, что программа ожидает данные. Я получил код из этого урока: Как использовать объект ядра событий WIN32