2017-06-21 5 views
1

私は、Eclipse RAPを使用して、次のユースケースを持っている:Eclipse RAPでは、クライアントに現在のUI状態をプッシュ/強制する方法はありますか?

  • Textフィールド内のテキストを検索し、
  • 「....検索」 に検索
  • 変更Labelテキストを開始入り
  • ラベルはに変更する必要にもかかわらず、Table

問題で実際の検索(非同期)と表示結果をやる「検索.... "実際の検索を開始する前に、"検索.... "に検索が行われた後に変更されます。

  • Textフィールドとスタートでテキストを検索入力します。

    は私が探しているラベルを変更した後、前の探索に、クライアントに現在のUIの状態を/ /力をプッシュ更新する方法です。検索

  • は、実際の検索を行うからLabelテキストは "検索..."
  • 変更クライアントへ
  • プッシュ現在のUI状態(ここではいくつかのサンプルコードTable

で非同期)、表示結果:

Label statusLabel = new Label(parent, SWT.NONE); 
    Text searchText = new Text(parent, SWT.SEARCH); 
    searchText.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetDefaultSelected(SelectionEvent e) { 
      // change label 
      statusLabel.setText("searching..."); 

      // HERE force client update 

      // start searching 
      Display.getCurrent().asyncExec(new Runnable() { 
       @Override 
       public void run() { 
        // do actual search 
       } 
      }); 
     } 
    }); 

答えて

2

asyncExecはまだそれがちょうどDisplay.readAndDispatchへの次の呼び出しまで少しそれを遅らせるUIスレッドでコードを実行します。したがって、検索コードはまだブロックされ、ラベルの更新は許可されません。

実際に別のスレッドで検索を実行する必要があります。

asyncExecは、可能であれば、UIスレッドで少量のコードを実行するバックグラウンドスレッドで使用することを目的としています。 (バックグラウンドスレッドでDisplay.getCurrent()ではなくDisplay.getDefault()を使用する必要があります)。

だからあなたのバックグラウンドスレッドであなたがような何か:私は分離されたスレッドで検索を実行する場合

while (more to do) 
{ 
    .... do a step of the search 

    Display.getDefault().asyncExec(.... UI update code ....); 
} 
+0

を、私は右のUIにアクセスすることはできないのだろうか?例えば更新ステータスラベル、更新結果テーブル。私は "無効なスレッドアクセス"例外に遭遇するだろうと思いますか? –

+0

バックグラウンドスレッドで 'asyncExec'(または' syncExec')を使用して、UI更新コードを実行します。 –

+0

Display.getDefault()とDisplay.getCurrent()は両方ともスレッド内でnullだったので、スレッドを開始する前に変数として格納しなければなりませんでした。 –

関連する問題