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. JavaのreplaceAll()で奇妙な問題が発生しました。
- 2. File.Moveコマンドで奇妙な問題が発生しました
- 3. xamarin.formsで奇妙な問題が発生しました。
- 4. ループで奇妙な問題が発生しました
- 5. Express/Nodeで奇妙な(キャッシュ)問題が発生しました
- 6. PHPのsession_set_save_handler()で奇妙な問題が発生しました
- 7. 奇妙なCoreImageクロッピングの問題が発生しました
- 8. JqueryUIとFirefoxで奇妙な問題が発生しました。コンテンツの位置がダイアログにありません
- 9. #import "Project-Swift.h"は奇妙な問題が発生します
- 10. Xcode5アプリケーションのテストで奇妙な問題が発生するiOS Simulatorがアプリケーションのインストールに失敗しました
- 11. iPadの線画で奇妙な問題が発生しました
- 12. Xamarinで奇妙な問題が発生しました。ローカルイメージはIOSに表示されません
- 13. アプリケーションを終了した後にエラーが発生しました
- 14. 私のDLLを使用するアプリケーションで新規/削除に奇妙な問題が発生しました
- 15. xcode iphoneアプリの問題が発生しました。広告のクリックで終了しません。
- 16. vimで奇妙な問題が発生しましたが、コードが更新されない
- 17. ブーストで奇妙なリンカーエラーが発生しましたか?
- 18. Xcodeで奇妙なメモリエラーが発生しました
- 19. XSLT 2.0で奇妙なエラーが発生しました[SXXP0003]
- 20. OSError IDで奇妙なエラーが発生しました:WinError 10038
- 21. security.xmlで奇妙なエラーが発生しました
- 22. Travis CIで奇妙なJestエラーが発生しました
- 23. デジタルオーシャンのプロダクションサーバーで奇妙なエラーが発生しました
- 24. PHP execコマンドで奇妙なエラーが発生しましたか?
- 25. ノードjsのjsonで奇妙なエラーが発生しました
- 26. node.jsで奇妙なJSON.parse()エラーが発生しました
- 27. Enterで奇妙な動作が発生しました
- 28. 古いレール2.1で奇妙なエラーが発生しました
- 29. '|'で奇妙なsqlalchemyエラーが発生しました演算子
- 30. FirebaseのonDataChange()で奇妙なHashMapエラーが発生しました
私たちは初心者のためのコードを表示することができます –
FreeOnTerminateをtrueに設定してから、メインクラス破壊時にTerminateをtrueに設定してみてください。 – LeleDumbo
@LeleDumboこれは役に立ちません。あなたはスレッドを待つ必要があります。 OPは、明らかに、 'Thrd.Free'で既にそうしています。 –