6

インターネットからファイルをダウンロードしたいのですが、これは簡単な作業だと思います。いくつかの異なるアプローチを試してみると、それぞれに独自の欠点があることがわかりました。主な問題は次のとおりです。

  • ファイルをダウンロードするまでアプリケーションがフリーズする
  • インターネット接続が失われた場合/サーバーが応答しない場合、アプリケーションは永久にフリーズします。

(詳細:

HTTP経由でインターネットからファイルを取得する方法は?
インターネットからファイルをダウンロードしている間、接続はタイムアウトしません

それで、ついに私は何人かの人々から得た提案を使って、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(おそらく)。

ありがとう

4

2 に答える 2

4

おそらく、IndyをIndyの方法で使用する必要があります。スレッドを使用することです。Indyは、ほとんどのインターネットプロトコルが機能するため、ブロッキングモードで機能するように特別に設計されています(例:HTTPを使用して、プロトコルレベルで要求を送信し、次に応答を読み取ります。同時に送信受信を行うことはありません)。 。TIdAntiFreezeスレッドを処理せずにいくつかのIndy機能を使用するのに役立つはずです。少なくとも概念的には、それは醜いハックなので、私はそれを使用したことはありません。

スレッドを処理したくない場合は、ICSを確認する必要があります。これは、スレッド化せずに非同期モードで使用するように設計されています。TIdAntiFreezeブロッキングしていないので、同等のものは必要ありません。ダウンロードを開始し、進行状況と完了の通知を取得するためにいくつかのイベントを処理します。ICSは、インディと同じようによく知られており、プロフェッショナルであり、広く使用されています。

于 2010-07-07T09:57:13.690 に答える
0

この種の問題を解決することはそれほど難しくありません。最初に行う必要があるのは、エラー処理を適切に処理したことを確認することです。何かが失敗した場合は、すべてが適切にクリーンアップされていることを確認してください。それを超えて、ダウンロードコードが別のスレッドの一部であることを確認してください。問題がある場合は、いつでもメインプログラムからスレッドを終了できます。これが私にとってうまく機能しているコード(スレッドではなくダウンロードのみ)です。

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;
于 2010-07-06T20:49:11.787 に答える