2011-07-09 12 views
2

OKズームコンポーネントを作成していて、セカンダリスレッドの画面からキャプチャしたかったのです。 空のコンポーネントでTThreadを派生させたいというふりをすることができます。私はスレッドにコードを書きませんでしたので、単なる役に立たないスレッドです。私はこのコードを書いた:Thrd := TCaptureThread.Create(False);コンポーネントのメインクラスです。 その後、私はメインクラスの破壊コードにThrd.Freeを書きました。今ではアプリケーション全体を閉じると、すべてが破棄されますが、プロセスは完全に終了しません。 Windowsタスクマネージャーでは、スレッド数は1であるがプロセスは残っていることが示されています。スレッド作成ラインにコメントすると、すべてがOKになり、アプリケーションはすぐに終了します。私はこれについて何をしますか? :(SO多くのものになることができ、事前スレッドで奇妙な問題が発生しました。アプリケーションが終了しません。

+0

私たちは初心者のためのコードを表示することができます –

+0

FreeOnTerminateをtrueに設定してから、メインクラス破壊時にTerminateをtrueに設定してみてください。 – LeleDumbo

+0

@LeleDumboこれは役に立ちません。あなたはスレッドを待つ必要があります。 OPは、明らかに、 'Thrd.Free'で既にそうしています。 –

答えて

6

あなたがThrd.Freeを呼び出すときTThread.Destroyから次のコードが実行される:

Terminate; 
if FCreateSuspended then 
    Resume; 
WaitFor; 

スレッドでFreeを呼び出すと、これに同期スレッドを終了します。

私の推測では、WaitForへの呼び出しは返されません。おそらくTCaptureThread.Executeは、Terminatedをチェックせずに終了します。おそらくTCaptureThreadがメインスレッドで待機しているので、スレッドデッドロックで待機します。

質問に基づいて推測以外のことをするのはかなり難しいですが、あなたのコードがThrdの破壊でWaitForコールを過ぎているかどうかをチェックしたいと思います。デバッグDCUを有効にし、呼び出すブレークポイントをWaitForに設定し、自分で参照してください。

0

おかげで...あなたのスレッドのExecute方法からは、デッドロックに出たことはありません。あなたが診断しようとすればいい

最初のものが実行されますアプリケーションが終了したら、アプリケーションを一時停止してスレッドのデバッグパネルを確認し、そこにある各スレッドをクリックして確認しますそのコールスタックを使用すると、なぜそれがハングするのか、どのスレッドがハングするのかがわかります。

-2

このように、あなたのスレッドを書く:

形で
type 
    TCaptureThread = class(TThread) 
    private 
    // 
    protected 
    procedure Execute; override; 
    public 
    constructor Create(CreateSuspended: False); 
    end; 

implementation 

constructor TCaptureThread.Create(CreateSuspended: Boolean); 
begin 
    inherited Create(CreateSuspended); 
    // Set FreeOnTerminate to True 
    FreeOnTerminate := True; 
end; 

procedure TCaptureThread.Execute; 
begin 
    // Write the Execute method here... 
    // And don't forget to synchronise with the form 
end; 

end. 

、あなたのスレッドをインスタンス化

Thrd := TCaptureThread.Create(False); 

Thrd.Terminate; 

Thrd.Execute; 

それを実行し、あなたのスレッドを終了I私はされているgのスレッドをこの方法でしばらくの間、私は問題がなかった。

+3

これはどのように役立ちますか?スレッドで待っていません。 –

+0

Thrd.Executeを呼び出すとスレッドが実行されず、代わりにメインスレッドのコードが実行されます。 – djsoft

関連する問題