Я хочу загрузить файл с Интернета, и я предполагаю, что это должно быть простой задачей. Попытка нескольких разных подходов, я нашел, что у каждого есть его собственный недостаток. Основные вопросы:
(детали:
Как получить файл из Интернета через 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 (вероятно).
Спасибо
Решить такого рода проблемы не так уж и сложно. Первое, что вам нужно сделать, это убедиться, что вы правильно обработали обработку ошибок. Если что-то не удается, убедитесь, что все правильно очищено. Кроме того, убедитесь, что загружаемый код является частью отдельного потока. Если есть какие-либо проблемы, вы всегда можете прервать поток из своей основной программы. Вот код (только для загрузки, а не для потоковой передачи), который у меня работает нормально.
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 способ Indy: использование потоков. Indy был специально разработан для работы в режиме блокировки, потому что именно так работает большинство интернет-протоколов (пример: с HTTP, на уровне протокола, вы отправляете запрос, а затем читаете ответ.Вы не отправляете и не получаете одновременно). Предполагается, что TIdAntiFreeze поможет вам использовать некоторые функции Indy, не имея дело с потоками; Я никогда не использовал это, потому что, по крайней мере, концептуально, это уродливый взлом.
Если вы не хотите иметь дело с потоками, вам следует взглянуть на ICS ( ссылка на домашнюю страницу ICS ). ICS был разработан для использования в асинхронном режиме, без многопоточности. Ему не нужен эквивалент TIdAntiFreeze, потому что он не блокирует. Вы начинаете загрузку и обрабатываете некоторые события, чтобы получить уведомления о ходе выполнения и завершении. ICS так же хорошо известен, профессионален и широко используется, как и Indy.