2012-02-28 2 views
1

UIを更新し、UIスレッドまたは他のスレッドから実行できるメソッドを実装しています。 Javadocsによると、後者の場合、Display.syncExec()またはDisplay.asyncExec()メソッドを使用する必要があります。私のメソッドがUIスレッドで実行されるか、syncExec/asyncExecが両方の場合に適しているかどうかをチェックする必要がありますか?UIスレッドとEclipseの他のスレッドの両方で機能するUI更新メソッドを実装するにはどうすればよいですか?

答えて

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. 
} 
+0

私の現在のユースケースでは、エラーがユーザーに報告されています。この場合、あなたはどう思いますか? – vitaut

+0

私はあなたが既にUIスレッド上にいる場合に起こりますので、エラーを直ちに欲しいと言いたいと思います。 UIスレッドをまだ使用していない場合は、asyncExecは問題ありません。 –

1

Display.syncExec/asyncExecを実行することは、UIであるかどうかにかかわらず、どのスレッドからでも呼び出すことができます。

UIスレッドからsyncExecを呼び出すとデッドロックが発生する可能性があります。これは、syncExecメソッドが最初に呼び出し元のスレッドがUIスレッドであるかどうかをチェックするためではありません。その場合はRunnablerunメソッドが直ちに実行されます。

関連する問題