| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Задержка при выполнении InternetOpenURL |
| Автор: urix 26.12.2005, 14:22 |
| Если, например интернета нет, или нет запрашиваемого файла, то программа надолго (30 секунд) задумывается при выполнении hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,Flags,0); Как БЕЗ ДЛИТЕЛЬНОЙ ЗАДЕРЖКИ проверить, есть ли доступ к нужному файлу? -------------------------------- InternetGetConnectedState с параметром INTERNET_CONNECTION_OFFLINE не помогает, если например интернет через VPN, и отключен. То же самое и InternetQueryOption с параметром INTERNET_OPTION_CONNECTED_STATE. -------------------------------- InternetCheckConnection(pchar(fileURL),FLAG_ICC_FORCE_CONNECTION,0) тоже задумывается на 30 секунд. -------------------------------- InternetCheckConnection(pchar(fileURL),0,0) вообще всегда возвращает false. -------------------------------- пробовал так: InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT... InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT... InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT... но тоже не помогает. |
| Автор: Snowy 26.12.2005, 16:35 | ||
1. Перенести файл на другой хостинг - который отвечает на пинги. 2. Использовать другие способы доступа (Indy, WinSocks, etc.) 3. Запустить InternetOpenURL в отдельном потоке, который сообщит основному по мере появления результатов, не мешая работе программы. |
| Автор: urix 26.12.2005, 17:02 |
| Snowy 1. Пинги хостов работают нормально. Адреса с которых качаются файлы я не могу выбирать. То есть если файл есть - он качается без проблем, а если нет, то прога задумывается. 2. посмотрю 3. Файлов иногда приходится качать много, один за другим, так что вариант с отдельным потоком для проверки не подходит. И ещё, проблема наверное разделяется на две: 1. Сеть есть, а интернета нет 2. Интернет есть, но нужного файла по заданному url нет. Кстати, в описании InternetCheckConnection написано что пингуется именно хост. То есть наличие конкретного файла так не узнать. Вероятно, надо сделать какой-то TIMEOUT меньше - но какой? |
| Автор: Snowy 26.12.2005, 17:11 | ||||||||
Нет, легко решается простым приемом - просто проверяем наличие урла, который гарантировано существует. (типа гугль).
Просто выстраиваешь список из урлов на закачку. Можешь качать в несколько потоков или в один. Закачал - берем следующий по списку.
Ну да, ну да. Пинг тут не поможет. Видимо винда несколько раз подряд пинговать пытается для надежности. Честно говоря, не знаю, как это можно победить... На Indy этот вопрос решается легко, но там встает проблема с настройками прокси. Их нужно у пользователя спрашивать. Добавлено @ 17:12
По идее, задумываться должно при отсутствии коннекта, а не файла. При отсутствии файла должно бодренько рапортовать 404. |
| Автор: RA 26.12.2005, 17:57 | ||
А чё отступился? В правильном направлении копал .... Если покажешь что получилось в этом направлени может совмесными усилиями отыщем ошибку. |
| Автор: urix 26.12.2005, 18:23 |
| Перед выполнением InternetOpenURL, запрашиваю значения InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT... InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT... InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT... и ставлю новые, например в 30 раз меньше. В конце возвращаю всё на место. Разницы я не заметил. Первоначальные значения возвращались такие: INTERNET_OPTION_CONNECT_TIMEOUT=300000 INTERNET_OPTION_RECEIVE_TIMEOUT=не помню точно сколько нулей, но больше (360000...) Добавлено @ 18:26 Snowy Во многих случаях, действительно как и полагается возвращается 404, но есть исключения - в них то и проблема. |
| Автор: RA 26.12.2005, 22:08 |
| Я когда-то писал подобное, заного писать не буду, но если код покажешь (весь код, чтоб я смог сам протестировать), то скорее всего помогу. |
| Автор: urix 26.12.2005, 22:42 | ||
| RAdmin Условия: Delphi7, локальная сеть активна, интернет выключен.
Добавлено @ 22:45 всё это в WinXP SP2 |
| Автор: RA 27.12.2005, 15:09 |
| urix Дейсвительно в заданных условиях wininet глючит. думаю в данном случаи больше подойдёт winhttp.dll |
| Автор: urix 27.12.2005, 17:52 |
| RAdmin а для него должен быть где-то хедерный файл? |
| Автор: RA 28.12.2005, 10:53 |
| Вот набор компонентов, в том числе и Http клиенты на основе wininet и winhttp, с исходниками и примерами, думаю это будет более полезно. Найдёшь все что нужно для работы с winhttp. http://torry.net/vcl/internet/http/Alcinoe30619.zip PS: MSDN должен содержать описание всех функций winhttp. winhttp можно совместно использовать с wininet, но что касается работы с протоколом http то winhttp надежнее. Работать с winhttp также как и с wininet, всё почти одинаково. |