Соединение не время ожидания при использовании Indy

StackOverflow https://stackoverflow.com/questions/3187446

  •  02-10-2019
  •  | 
  •  

Вопрос

Я хочу скачать файл из Интернета, и я думаю, что это должно быть простой задачей. Попробуя несколько разных подходов, я обнаружил, что у каждого есть свой недостаток. Основные проблемы:

  • Приложение в замерзании, пока не загрузит файл
  • Приложение замораживает навсегда, если подключение к Интернету потеряно/сервер не отвечает.

(Детали:

Как получить файл из Интернета через http?
Соединение не время ожидания при загрузке файла из Интернета )

Итак, наконец, я использовал предложения, которые я получил от нескольких человек, чтобы использовать такие библиотеки «Pro», такие как Indy. Тем не менее, Indy не намного лучше, чем фрагменты кода, которые я пробовал (но гораздо больше и трудно поддерживать). Используя Indy, приложение не замораживает только в течение коротких периодов, поэтому оно все еще (каким -то образом) используется. Тем не менее, приложение не может быть выключено до завершения загрузки (никогда, если интернет -соединения не будут нарушены).

Другие люди сообщили о той же проблеме: http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadid=25199&tstart=90

Итак, есть какой -то взлом, который я должен был сделать для Tidantifreeze, чтобы заставить его работать?

Кроме того, свойство ConnectTimeout не признано.

fIDHTTP := TIDHTTP.Create(NIL);
fIDHTTP.ConnectTimeout:=5000;

Должен ли я отбросить Indy и вернуться к оригинальной идее загрузки файла в отдельном потоке и закончить поток, когда он не отвечает (по крайней мере, так я избавляюсь от сторонних библиотек)? Будут непредвиденные побочные эффекты, если я это сделаю?

Использование: Delphi 7, Indy 10.1.5 10.5 (вероятно).

Спасибо

Это было полезно?

Решение

Не так уж и сложно решить подобные проблемы. Первое, что вам нужно сделать, это убедиться, что вы правильно обработали ошибки. Если что -то терпит неудачу, убедитесь, что все очистится должным образом. Помимо этого убедитесь, что код загрузки является частью отдельного потока. Если есть какие -либо проблемы, вы всегда можете прекратить поток из своей основной программы. Вот код (только для загрузки, а не потока), который работает для меня нормально.

with TDownloadURL.Create(nil) do
  try
    URL := 'myurltodownload.com';
    filename := 'locationtosaveto';
    try
      ExecuteTarget(nil);
    except
      result := false;
    end;
    if not FileExists(filename) then
      result := false;
  finally
    clear;
    free;
  end;

Другие советы

Вам, вероятно, нужно использовать Indy The Indy Way: Использование потоков. Инди была специально разработана для работы в режиме блокировки, потому что именно так работает большинство интернет -протоколов (пример: с HTTP, на уровне протокола вы отправляете запрос, затем читаете ответ. Вы не отправляете и получаете одновременно). Tidantifreeze должен помочь вам использовать некоторые функции Indy без работы с потоками; Я никогда не использовал это, потому что, по крайней мере, концептуаль, это безобразный взлом.

Если не хотите иметь дело с потоками, вы должны взглянуть на ICS ( Ссылка на домашнюю страницу ICS ) ICS была разработана для использования в асинхронном режиме без потока. Это не нуждается в эквиваленте Tidantifreeze, потому что он не блокирует. Вы начинаете загрузку и обрабатываете некоторые события, чтобы получить уведомления о прогрессе и завершении. ICS так же известен, профессиональ и дико используется, как и Indy.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top