OKズームコンポーネントを作成していて、セカンダリスレッドの画面からキャプチャしたかったのです。 空のコンポーネントでTThreadを派生させたいというふりをすることができます。私はスレッドにコードを書きませんでしたので、単なる役に立たないスレッドです。私はこのコードを書いた:Thrd := TCaptureThread.Create(False);
コンポーネントのメインクラスです。 その後、私はメインクラスの破壊コードにThrd.Free
を書きました。今ではアプリケーション全体を閉じると、すべてが破棄されますが、プロセスは完全に終了しません。 Windowsタスクマネージャーでは、スレッド数は1であるがプロセスは残っていることが示されています。スレッド作成ラインにコメントすると、すべてがOKになり、アプリケーションはすぐに終了します。私はこれについて何をしますか? :(SO多くのものになることができ、事前スレッドで奇妙な問題が発生しました。アプリケーションが終了しません。
答えて
あなたがThrd.Free
を呼び出すときTThread.Destroy
から次のコードが実行される:
Terminate;
if FCreateSuspended then
Resume;
WaitFor;
スレッドでFree
を呼び出すと、これに同期スレッドを終了します。
私の推測では、WaitFor
への呼び出しは返されません。おそらくTCaptureThread.Execute
は、Terminated
をチェックせずに終了します。おそらくTCaptureThread
がメインスレッドで待機しているので、スレッドデッドロックで待機します。
質問に基づいて推測以外のことをするのはかなり難しいですが、あなたのコードがThrd
の破壊でWaitFor
コールを過ぎているかどうかをチェックしたいと思います。デバッグDCUを有効にし、呼び出すブレークポイントをWaitFor
に設定し、自分で参照してください。
で
おかげで...あなたのスレッドのExecute
方法からは、デッドロックに出たことはありません。あなたが診断しようとすればいい
最初のものが実行されますアプリケーションが終了したら、アプリケーションを一時停止してスレッドのデバッグパネルを確認し、そこにある各スレッドをクリックして確認しますそのコールスタックを使用すると、なぜそれがハングするのか、どのスレッドがハングするのかがわかります。
このように、あなたのスレッドを書く:
形で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のスレッドをこの方法でしばらくの間、私は問題がなかった。
これはどのように役立ちますか?スレッドで待っていません。 –
Thrd.Executeを呼び出すとスレッドが実行されず、代わりにメインスレッドのコードが実行されます。 – djsoft
- 1. File.Moveコマンドで奇妙な問題が発生しました
- 2. ループで奇妙な問題が発生しました
- 3. Express/Nodeで奇妙な(キャッシュ)問題が発生しました
- 4. PHPのsession_set_save_handler()で奇妙な問題が発生しました
- 5. JavaのreplaceAll()で奇妙な問題が発生しました。
- 6. xamarin.formsで奇妙な問題が発生しました。
- 7. JqueryUIとFirefoxで奇妙な問題が発生しました。コンテンツの位置がダイアログにありません
- 8. Xcode5アプリケーションのテストで奇妙な問題が発生するiOS Simulatorがアプリケーションのインストールに失敗しました
- 9. iPadの線画で奇妙な問題が発生しました
- 10. アプリケーションを終了した後にエラーが発生しました
- 11. xcode iphoneアプリの問題が発生しました。広告のクリックで終了しません。
- 12. RandomAccessFilesは、アプリケーションが終了するまで終了しません。
- 13. WCFで奇妙なTimeoutExceptionが発生しました
- 14. node.jsで奇妙なJSON.parse()エラーが発生しました
- 15. Visual C#で奇妙なコンパイルエラーが発生しました
- 16. Enterで奇妙な動作が発生しました
- 17. Arduinoのヘッダーファイルで奇妙なコンパイラエラーが発生しました
- 18. 古いレール2.1で奇妙なエラーが発生しました
- 19. ブーストで奇妙なリンカーエラーが発生しましたか?
- 20. Xcodeで奇妙なメモリエラーが発生しました
- 21. Zend_Loader_PluginLoader :: setIncludeFileCache()で奇妙なエラーが発生しました
- 22. プログラムで奇妙なエラーが発生しました
- 23. ノードjsのjsonで奇妙なエラーが発生しました
- 24. XSLT 2.0で奇妙なエラーが発生しました[SXXP0003]
- 25. Xcode 4.1で奇妙なコンパイルエラーが発生しました
- 26. PHP execコマンドで奇妙なエラーが発生しましたか?
- 27. security.xmlで奇妙なエラーが発生しました
- 28. 私のDLLを使用するアプリケーションで新規/削除に奇妙な問題が発生しました
- 29. vimで奇妙な問題が発生しましたが、コードが更新されない
- 30. アプリケーションの終了時にアクセス違反が発生しました
私たちは初心者のためのコードを表示することができます –
FreeOnTerminateをtrueに設定してから、メインクラス破壊時にTerminateをtrueに設定してみてください。 – LeleDumbo
@LeleDumboこれは役に立ちません。あなたはスレッドを待つ必要があります。 OPは、明らかに、 'Thrd.Free'で既にそうしています。 –