SWT 中在界面实现时间实时刷新

时间:2020-12-30 22:20:02
SWT 中在界面实现时间实时刷新,我是在一个界面想完成,然后就写了个线程内部类,掉了界面的一个label然后这个线程死循环去刷新时间也就这个label,但是尝试了很多次都是界面死掉了。而且发现只要一有其他线程访问了界面的内容,界面就会死。而且asyncExec这个方法也不管用啊,照样死。

3 个解决方案

#1


不要在UI线程中执行那个死循环就行了,只有在调label.setText()的时候,才去用display.async方法去调用UI现成的东西
代码可以发上来看看

#2


我是这样搞的:
在ui里创建了一个内部线程类,然后线程掉的label.setText();去刷新时间、
class TimeChange extends Thread
{
    public void run()
    {
        for(;;)
            {
                 try{
                    sleep(1000);
                    }catch{}
                    label.setText();

             }
    }
}

shell.getDisplay().asyncExec(timeChange);

#3


这样肯定会卡UI线程啊,

class TimeChange extends Thread
{
    public void run()
    {
        for(;;)
            {
                 try{
                    sleep(1000);
                    }catch{}
                    shell.getDisplay().asyncExec(new Runnable(){
                         public void run() {
                            label.setText();
                         }
                    });
                    
             }
    }
}

new TimeChange().start();



shell.getDisplay().asyncExec本身的意思并非起一个线程,UI线程只有一个,这个调用的代码意思是把参数里的那个那些代码放到UI线程中执行,你却在这里面去sleep,当然会卡死..

要注意,runnable本身只是一个非常普通的接口,不是线程;

#1


不要在UI线程中执行那个死循环就行了,只有在调label.setText()的时候,才去用display.async方法去调用UI现成的东西
代码可以发上来看看

#2


我是这样搞的:
在ui里创建了一个内部线程类,然后线程掉的label.setText();去刷新时间、
class TimeChange extends Thread
{
    public void run()
    {
        for(;;)
            {
                 try{
                    sleep(1000);
                    }catch{}
                    label.setText();

             }
    }
}

shell.getDisplay().asyncExec(timeChange);

#3


这样肯定会卡UI线程啊,

class TimeChange extends Thread
{
    public void run()
    {
        for(;;)
            {
                 try{
                    sleep(1000);
                    }catch{}
                    shell.getDisplay().asyncExec(new Runnable(){
                         public void run() {
                            label.setText();
                         }
                    });
                    
             }
    }
}

new TimeChange().start();



shell.getDisplay().asyncExec本身的意思并非起一个线程,UI线程只有一个,这个调用的代码意思是把参数里的那个那些代码放到UI线程中执行,你却在这里面去sleep,当然会卡死..

要注意,runnable本身只是一个非常普通的接口,不是线程;