Соединение не делает тайм-аута при использовании Инди

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

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

(детали:

Как получить файл из Интернета через HTTP?
Соединение не делает тайм-аута при загрузке файла с Интернета )

Так, наконец я использовал предложения, которые я получил от нескольких человек для использования "про" библиотек, таких как Инди. Однако Инди не намного лучше, чем части кода, который я попробовал (но это - путь, намного больше и трудный поддержать). При использовании Инди приложение не делает замораживаний только в течение коротких периодов, таким образом, это все еще (так или иначе) применимо. Однако приложение не может быть закрыто до концов загрузки (никогда, если Интернет-соединения повреждается).

Другие люди сообщили о той же проблеме: 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;

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

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

Спасибо

6
задан Community 23 May 2017 в 11:48
поделиться

2 ответа

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

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;
0
ответ дан 17 December 2019 в 07:00
поделиться

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

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

4
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: