在递归方法中访问UI时使用SWT Eclipse进行线程处理

时间:2012-05-11 17:36:50

标签: eclipse multithreading swt

我有一个像这样的递归方法:

    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,所以我尝试使用Job,但我的问题是我希望只为已检查的TreeItem执行更新模型,它应该遵循已检查的TreeItems的序列。如果我使用Job,我无法控制首先处理哪个已检查的TreeIem。我还尝试将整个executeAction方法放在Job中,但在访问TreeItem时遇到了无效的线程。

我需要一些想法,这样我就可以在维护序列的同时发布一个新线程,而不是冻结我的UI。

感谢。

1 个答案:

答案 0 :(得分:0)

你可以试试这个。收集树中的模型对象并在单独的作业中运行该updateModel。以下代码无法运行。你可能需要调整一下。

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

//创建getter,setter ..       }

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 );
}

}