2012-03-02 38 views
3

私はDelphiでマルチスレッドアプリケーションを扱うのは初めてですから、すべてがまだ私のためのものですが、私は多くを読んでいます。Delphi Indyスレッドを終了せずに終了タイムアウト

私のスレッドは簡単です。私はIndy(IdHTTP)を使ってWebページのコンテンツを取得し、コンテンツに文字列が含まれているかどうかを確認します。ここに問題はありません。

スレッドを終了するには、WHILE DOを使用するブール値を使用します。動作しているようですが、問題があります:タイムアウトをIndyで使用しているように、スレッドが終了する前に(サーバーが応答していない)タイムアウト時間の終了を待つ必要がある場合があります...

迷惑ですが、特に+200のスレッドを使用している場合は特にそうです。マルチスレッドなどの手順を使用している他のソフトウェアでは、「停止」をクリックするとすべてが数秒で停止し、それが必要です。

私はそう...私はIdHTTPは「私のinstuctionsを読む」ことができるように、不凍液を使用する必要があること

を読んで、私は少しここで失いましたよ。 私はここに、それは非常に必要だと思うが、していない私のコードです:ベニー

ライトを事前に http://pastebin.com/G7De8bgb

感謝:)

+3

はなぜ取得停止していますか?なぜあなたはそれらを終了していますか? TidAntiFreezeの近くには行かないでください。 –

+0

たとえば、プロセスが長すぎる場合。いつでも手続きを中止できるようにしたいと思います。スレッドを「殺す」のと同じですが、もちろん安全な方法です。ありがとう。 Beny – Beny

答えて

6

クラスTidHTTPは、OnWorkイベントを有する。このイベントを使用して、データのダウンロードまたはアップロードをキャンセルします。このイベントでキャンセルするには?サイレント例外を放つ。

これは擬似コードです:

THTTPThread = class(TThread) 
    private 
     HTTPComponent: TidHTTP; 
     procedure OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode; 
            AWorkCount: Int64); 
    published 
     procedure execute(); 
end; 

implementation 
procedure THTTPThread.execute; 
begin 
    Self.HTTPComponent := TidHTTP.Create(nil); 
    with HTTPComponent do 
    begin 
     OnWork := Self.OnHTTPProgress; 
     Get('http://www.google.com'); 
    end; 
end; 

procedure THTTPThread.OnHTTPProgress(ASender: TObject; AWorkMode: TWorkMode; 
    AWorkCount: Int64); 
begin 

    if Self.Terminated then 
     Abort; 
end; 

はOnWorkが呼び出さされているステージがランダムであることを考慮してください。このイベントは、リクエストの途中で、懇願時に、または最後に呼び出すことができます。上記のコードは、ブラウザの停止ボタンを押すのと同じように機能します。

[UPDATE] 「最後の応答」が指定されたミリ秒前に受信された場合、そのスレッドがサーバーの応答のためにハングアウトされたときにOnWorkイベントが呼び出されない場合は、タイムアウトを使用できます。これにはGetTickCountを使用してください。

+0

ああ、本当に面白い!私は試してみます。入力いただきありがとうございます。 Beny – Beny

+0

私の最初の投稿以来、私はIndyをip * Worksに変更しました。すべてが同じままです、私は 'HTTP.Interrupt;'を実装しようとします。だから、[停止]をクリックしたときに、私は新しいスレッドの作成を中止するが、私は長い間の研究の後... – Beny

+0

を既に開始したスレッドを中断するために私のコードを置くことができる場所を私は知らない、あなたは適切なソリューションを見つけているように見えます。ありがとうございました !ベスト。 Beny;) – Beny

2

私は同様のインディ使用して問題とWebサービス持っていました私たちが話していたシステムは、最高で信頼できませんでした(いくつかの呼び出しでは30分の読み取りタイムアウトを設定する必要がありました)。

リオコール(およびあなたのIdHTTP)コールがあなたのcanelをブロックしているので、それらを直接中止することはできません。

ただし、(異なるスレッドを使用している場合)get/webcallで例外が発生する下位のソケットを切断できます。

TIdHTTPを使用してアイデアをテストするための簡単なハックを実行しましたが、これはRioと同じように動作します。

メイン/制御スレッドでは、IDHTTP.Disconnectを呼び出して、スレッド内で発生する例外をキャッチする必要があります。あなたのコードを見て、あなたはThread.ExecuteでIdHTTPを作成しているので、そのクラスのコンストラクタにその宣言を移して、スレッドクラスのAbort関数がソケットを簡単に切断できるようにしなければなりません。

私はDelph 7とINDY10を使用しましたが、あなたの設定とちょっと違います。

誰もが、私はあまりにもそれを見てみたい、より良い/より少ないagresive方法を知っていればBTW

に役立ちます願っています。

+0

IdHTTPの接続を解除していただきありがとうございます。ちょうど私は、コードがすでに開始されているコードをどこに置くべきかについてちょっと分かります:■Beny – Beny

関連する問題