2012-05-11 16 views
0

でUIにアクセスしている間、私はこのような再帰的な方法があります:スレッド再帰的な方法

protected void executeAction(TreeItem ti) 
{ 
    boolean isChecked = ti.getChecked(); 

    if (isChecked) 
    { 
     Somedata data = (SomeData) ti.getData(); 
     String action = data.getSelectedAction(); 
     ActionManager am = data.getActionManager(); 
     AbstractActionAgent agent = am.getAction(action); 
     if (agent != null) 
     {     
      agent.updateModel(data); //Makes a server trips and long computation    
     } 
    } 
    int itemcnt = ti.getItemCount(); 
    TreeItem[] childTrees = ti.getItems(); 

    for (int i = 0; i < itemcnt; i++) 
    { 
     executeAction(childTrees[i]); 
    } 
} 

マイUPDATEMODEL方法は、UIをフリーズするので、私は仕事を使用してみましたが、私の問題は、私が欲しいということですチェックされたTreeItemに対してのみ実行される更新モデルであり、チェックされたTreeItemのシーケンスに従うべきである。私がJobを使用する場合、チェックされたTreeIemが最初に処理されるかどうかは制御できません。また、executeActionメソッド全体をJobに入れようとしましたが、TreeItemにアクセスする際に無効なスレッドが実行されました。

シーケンスを維持しながらUIをフリーズしないで新しいスレッドを実行できるようにするには、いくつかのアイデアが必要です。

ありがとうございました。

+0

を作成します。この方法では、メインスレッドでSWTボタンをクリックしてから呼び出されます。 – MartinKahn

答えて

0

これを試すことができます。ツリー内でモデルオブジェクトを収集し、そのupdateModelを別のジョブで実行します。以下のコードは実行されません。それをちょっと微調整する必要があるかもしれません。

class Node { 
    private SomeData nodeData; 
    private List<Node> children = new ArrayList(); 

//ゲッター、セッター... }

protected void executeAction(TreeItem ti, Node parentNode) { 
boolean isChecked = ti.getChecked(); 
Node n = null; 
if (isChecked) 
{ 
    Somedata data = (SomeData) ti.getData(); 
    if (parentNode != null) { 
     n = new Node(); 
     n.setNodeData(data); 
     parentNode.addChild(n); 
    } 

} 
int itemcnt = ti.getItemCount(); 
TreeItem[] childTrees = ti.getItems(); 

for (int i = 0; i < itemcnt; i++) 
{ 
    executeAction(childTrees[i],n); 
} 

}

+0

ありがとう@Ravi。同様のアプローチが私のために働いた。 – MartinKahn