У меня довольно простое приложение, которое загружает файлы в поток. Эта нить использует WinINet APIs, и начинается так:Как избежать полного использования ЦП или прекратить работу, в то время как InternetOpenURL пытается (и не удается) подключиться?
HINTERNET hInternet = InternetOpen(strUserAgent.c_str(), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
DWORD dwFlags = INTERNET_FLAG_NO_UI | INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD;
HINTERNET hUrl = InternetOpenUrl(hInternet, m_strURL.c_str(), L"", 0, dwFlags, NULL);
Однако, если нет подключения к Интернету, или удаленный узел вниз, InternetOpenUrl
займет много времени тайм-аут и полным. Хотя он делает это, то есть только в ситуации, когда он не может подключиться к удаленному хосту, он будет использовать от 80 до 100% одного процессора, пока он, наконец, не вернется. Это может продолжаться в течение минуты или около того из-за установки задержки таймаута. В одной системе , несмотря на настройки тайм-аута (см. Ниже), это продолжалось до десяти минут.
Как я:
- Избегай такое использование массивного CPU, когда он просто пытается подключиться?
- Сигнал потока для завершения, если я хочу закрыть приложение? Обычно тайм-аут прекрасен, но если приложение нужно закрыть, то он будет ждать окончания этого потока, который тратит много центрального процессора, делая очень мало внутри
InternetOpenUrl
.
[В сторону: Текущие настройки тайм-аута на моей системе, как показали InternetQueryOption:
INTERNET_OPTION_CONNECT_TIMEOUT
: 60sINTERNET_OPTION_RECEIVE_TIMEOUT
: 30sINTERNET_OPTION_SEND_TIMEOUT
: 30s
Изменение этих уменьшит время до того, как метод сдастся и вернется, и таким образом уменьшит время, затраченное на использование большого количества CPU, но может повлиять на соединение. В конце концов, тайм-ауты существуют по какой-то причине. Это приложение может использоваться в ситуациях с нечетным подключением, например на борту корабля, где подключение может потенциально заходить на спутник с высокой задержкой и занимать больше времени, чем стандартное подключение к Интернету. Я не знаю, какие разумные тайм-ауты будут. Кроме того, должен быть лучший способ избежать использования ЦП и прекратить работу быстрее, чем просто сократить таймауты.]
Это странно. Вы сталкиваетесь с проблемой заражения ЦП на многих компьютерах или только на вашем? Я не ожидаю такого поведения от WinInet. –
Это на два по крайней мере: Windows 7 на машине WMWare Fusion (моя - она только накачивает до 80% на моей) и Windows XP (я думаю) на второй машине (штат сотрудников QA). –
Вы пытались использовать WinInet в асинхронном режиме? –