UIを更新し、UIスレッドまたは他のスレッドから実行できるメソッドを実装しています。 Javadocsによると、後者の場合、Display.syncExec()またはDisplay.asyncExec()メソッドを使用する必要があります。私のメソッドがUIスレッドで実行されるか、syncExec/asyncExecが両方の場合に適しているかどうかをチェックする必要がありますか?UIスレッドとEclipseの他のスレッドの両方で機能するUI更新メソッドを実装するにはどうすればよいですか?
1
A
答えて
1
Display.syncExec/asyncExecの実行は、どのスレッド(UIスレッドを含む)からでも安全ですが、常に最適なルートであるとは限りません。たとえば、asyncExecは、実行スレッドをUIスレッド上に置いていても実行するためにキューにrunnableを追加します。あなたのユースケースに応じて、それは望ましいかもしれません。多くの場合、あなたが既にUIスレッド上にあることがわかっている場合は、作業項目を実行して実行する方がよいでしょう。
私は、UIを更新する必要があり、UI以外のスレッドから呼び出すことができる方法で、次のスニペットを使用します。 UIスレッドから呼び出された場合は、すぐに作業を実行します。他のスレッドから呼び出された場合は、asyncExecを使用して、呼び出しスレッドをブロックせずに次のバッチで作業をスケジュールします。
public void task()
{
if(this.display.getThread() != Thread.currentThread())
{
this.display.asyncExec
(
new Runnable()
{
public void run()
{
task();
}
}
);
return;
}
// Do whatever needs to be done with the UI.
}
1
Display.syncExec/asyncExec
を実行することは、UIであるかどうかにかかわらず、どのスレッドからでも呼び出すことができます。
UIスレッドからsyncExec
を呼び出すとデッドロックが発生する可能性があります。これは、syncExec
メソッドが最初に呼び出し元のスレッドがUIスレッドであるかどうかをチェックするためではありません。その場合はRunnable
のrun
メソッドが直ちに実行されます。
関連する問題
- 1. .NETのメインUIスレッド以外のスレッドでUIを実行するにはどうすればよいですか?
- 2. アンドロイドの非UIスレッドからUIを更新するにはどうすればよいですか?
- 3. このスレッドの途中でUIを更新するにはどうすればよいですか?
- 4. WindowsユニバーサルアプリケーションのUIを別のスレッドから更新するにはどうすればよいですか?
- 5. WPFアプリケーションのUIをスレッドから更新するにはどうすればよいですか?
- 6. iOSの非UIスレッドからUIラベルを更新する方法
- 7. 他のスレッドからUIを更新する
- 8. 他のスレッドからUIを更新する
- 9. UIスレッドを更新するワーカースレッドのCountdownTimer
- 10. スレッドをUIから更新する
- 11. UIスレッドから特定の種類のタスクを実行するにはどうすればよいですか?
- 12. c#WPF UIがハングするUIスレッドのデータを更新する
- 13. ブラックベリーで2つのUIスレッドLWUITを実装するには?
- 14. EclipseコンソールからUIスレッドをブロックしないようにする
- 15. UIスレッドとハンドラを使用する他のスレッドとの通信
- 16. メソッドがデコードされた方法でUIスレッドで実行されるかどうかを調べるにはどうすればよいですか?
- 17. UIスレッドのスレッド優先度はどのくらいですか?
- 18. これはUIスレッドに関してどのように機能するのですか?
- 19. WinForms UIを更新するBackgroundWorkerスレッド
- 20. ポータブルクラスライブラリのUIスレッドを更新します
- 21. Dipity Timeline UIを実装するにはどうすればよいですか?
- 22. doInBackgroundメソッドでUIまたはUIスレッドを呼び出す方法
- 23. スレッド:スレッドをブロックせずにUIを更新しますか?
- 24. DispatcherスレッドはUIコントロールでどのように動作するのですか
- 25. UIスレッドの外でカメラをオン/オフするにはどうすればよいですか?
- 26. CardLayout UIを更新するにはどうすればよいですか?
- 27. UIを更新するにはどうすればよいですか?
- 28. UIスレッドで更新されるストップウォッチを作成する
- 29. UIスレッドをブロックせずに複数のタスクを続行するにはどうすればよいですか?
- 30. セレンスレッド/クラス内のUIスレッド/クラスのラベルを更新する方法
私の現在のユースケースでは、エラーがユーザーに報告されています。この場合、あなたはどう思いますか? – vitaut
私はあなたが既にUIスレッド上にいる場合に起こりますので、エラーを直ちに欲しいと言いたいと思います。 UIスレッドをまだ使用していない場合は、asyncExecは問題ありません。 –