用户界面启动后,同时启动内部数据处理线程。在某个时刻,内部数据处理线程在后台进行数据处理后,要更新窗体上某个组件的值,请问有哪些比较好的处理方法。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【still_rain】截止到2008-06-27 13:43:05的历史汇总数据(不包括此帖):
    发帖数:7                  发帖分:180                
    结贴数:7                  结贴分:180                
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    把该组件声明为public的或者直接以参数传过去,然后直接更新值就行了!
      

  3.   


    估计你是web做多了走火入魔了,GUI的组件你更新了属性之后它自己会刷新显示的。
      

  4.   

    faint,可能性很大。借这个帖子再问个问题。界面用的是SWT,SWT禁止非本体线程对控件的显示内容进行更改。我的后台数据处理线程需要不定时的进行数据处理(时间随机),然后将处理结果反馈给用户界面(可能中间处理的一些信息也要打印到用户界面),这个数据处理的线程如何将这些需要更新的信息传递给用户界面?直接访问用户界面组件?
      

  5.   

    Display.getDefault().syncExec(new Runnable()
    {
    public void run()
    {
    //需要用非主线程刷新界面组件的代码
    }
    });
      

  6.   

    给个例子你看
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;public class MM
    {
        private Text text;    private Shell shell;    public static void main(String[] args)
        {
            try
            {
                MM window = new MM();
                window.open();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }    public void open()
        {
            final Display display = Display.getDefault();
            createContents();
            shell.open();
            shell.layout();        Thread thread = new Thread()
            {
                public void run()
                {
                    while(true)
                    {
                        Display.getDefault().syncExec(new Runnable()
                        {
                            public void run()
                            {
                                text.setText(System.currentTimeMillis() + "");
                            }
                        });                    try
                        {
                            sleep(1000);
                        }
                        catch(InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            };
            
            //设为后台线程,否则关闭窗体后该线程还在运行
            thread.setDaemon(true);
            thread.start();        while(!shell.isDisposed())
            {
                if(!display.readAndDispatch())
                {
                    display.sleep();
                }
            }        display.dispose();
        }    protected void createContents()
        {
            shell = new Shell();
            shell.setSize(266, 170);
            shell.setText("SWT Application");
            text = new Text(shell, SWT.BORDER);
            text.setBounds(34, 48, 197, 26);
        }
    }
      

  7.   

    首先非常感谢craky的热心帮助。
    你的这个方法感觉是用户界面去询问内部数据处理线程,控件内容应该刷新显示什么数据,而我的想法是想内部数据处理线程在需要更新控件时,再更新用户界面的相关控件。类似于内部线程发出一个消息或者事件,然后用户界面某个监听器捕获,然后进行处理。
    不知道意思表达的对不对,再一次表示感谢。
      

  8.   

    8楼代码里面的那个thread线程就相当于你的数据处理线程喽,呵呵~~~~~~~~~~~~你完全可以单独拿开放到别的地方去,我只是为了写起来方便用了个内部类的而已