2016-07-23 7 views
-2

私は一緒に働く10のスレッドを持っています。スレッドを開始すると、15秒後にすべてのスレッドがジョブが終了する前に終了し、1つのスレッドのみが残ります。作業が完了する前にスレッドが終了しないようにするにはどうすればよいですか?

マイコード:

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    AA; 
    BB; 
    CC; 
    DD; 
    EE; 
    FF; 
    GG; 
    HH; 
    II; 
    JJ; 
end; 

procedure TForm1.AA; //same procedure for BB,CC,DD,EE.FF,JJ,HH,II,JJ  
begin 
    lHTTP := TIdHTTP.Create(nil); 
    TTask.Create(Procedure 

    try 
     //HTTP Opertations 
    finally 
    end; 

    end).Start; 
end; 

注、私はできないFree HTTPコンポーネントので、私は私がAVを手に入れたし、私はどこへでも、正しく自由、それをデバッグする方法がわからない場合コード?しかし、それを解放することなくコードはうまくいくが、スレッドは終了する。ドッジ氏が言ったように問題かもしれない。

+0

だから、あなたは何を求めているのですか? – MartynA

+1

スレッドコードが完了すると、スレッドは破棄されます。あなたのスレッドが永遠に生き残るためには、内部で無限ループを実行する必要があります。 – Johan

+0

しかし、スレッドコードはまだ完了せず、スレッドが存在する@Johan – Thunderx

答えて

3

TIdHTTPコンポーネントの作成方法に基づいて、それは間違っています。スレッド外にオブジェクトを作成してから、スレッド内からオブジェクトを使用しないでください。これはスレッドセーフではありません。使用する場所と同じスレッドで作成する必要があります。このため、あなたもそれを解放することができません。だから、実際にはここで同時に解決する2つの問題があります。

あなたのlHTTP変数がコードのスコープ内にないことに気付きました。そこで、グローバル(またはそれ以外の場合は共有)の場所で宣言していると仮定します。各スレッドは、それ自身のインスタンスに対して独自の変数を必要とします。

だからあなたのコードでは、もう少し、次のようになります(例えばTADOConnectionなど)

procedure TForm1.AA; //same procedure for BB,CC,DD,EE.FF,JJ,HH,II,JJ  
begin 
    TTask.Create(Procedure 
    var 
     lHTTP: TIdHTTP; 
    begin 
     lHTTP := TIdHTTP.Create(nil); 
     try 
     //HTTP Opertations 
     finally 
     lHTTP.Free; 
     end; 
    end).Start; 
end; 

他のコンポーネントも、完全に失敗し、(そのような構成要素は、COMを利用するので)そのようなことを試みるためクラッシュしていました。幸いにも、TIdHTTPはCOMを使用していませんが、同じ理由でデザインに欠陥があります。あなたは、あなたがそれをデバッグすることを言うとき


は今、私はあなたが実際のスレッドでコードをデバッグ、それはこれの最後に到達する前に、ブレークポイントは、コード内の別の場所にジャンプを意味推測していますか?これはスレッドでデバッガを使用する場合に期待されます。スレッドに入るだけで、それぞれのシーケンシャルブレークポイントが同じスレッド内にあることを期待することはできません。つまり、別のスレッドに複数のブレークポイントがあると、デバッガはジャンプする可能性が非常に高くなります。 、それらは複数のスレッドです。何らかの作業ログを作成することをお勧めします。各スレッドはステータスと位置を報告します。

これは文字通り代替宇宙のようです。お互いに少し違うことをする複数の異なる類似スレッド。 Delphiデバッガは、単にすべての代替宇宙を見ることができるタイムロードです。

+1

私はまた、変数 'lHTTP'はスレッドセクション内で定義する方が良いと思う。 'TTask.Create(手続き型var lHTTP:TIdHTTP; begin ...'、私が間違っていれば修正してください。 – RepeatUntil

+0

@RepeatUntilそれを指摘してくれてありがとう、ありがとう、ありがとう、返答に追加 –

+1

スレッドをデバッグするとき、 'Thread他のすべてのスレッドをフリーズすることで、上で概説した問題(スレッド間でブレークポイントがジャンプする)を修正します。 –

関連する問題