Как обновить SWT GUI в вызове asyncExec ()

1

В моем SWT GUI я хотел бы иметь кнопку, которая запускает задание и во время выполнения этого задания обновляет текстовое поле, в котором будет отображаться журнал событий этой работы. Однако мое текстовое поле не обновляется до конца моего вызова asyncExec(). В приведенном ниже примере я хотел бы, чтобы мой текстовый блок обновлялся каждую секунду, но вместо этого он получает все обновления сразу после 10 полных секунд, когда он заканчивает выполнение.

Есть ли способ достичь этого?

private void UpdateUI()
{
    Display.getDefault().asyncExec(new Runnable() {
          @Override
          public void run() 
          {
            StringBuilder sb = new StringBuilder();
            for(int i=1; i<=10; i++)
            {
                sb.append("Running iteration " + i + "\n");
                txtLogBox.setText(sb.toString());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
          }});
}
Теги:
asynchronous
swt

1 ответ

2
Лучший ответ

Вы спите в потоке пользовательского интерфейса. Вам нужно выполнить свою длительную работу в другом потоке и публиковать обновления для потока пользовательского интерфейса с помощью asyncExec. Например:

new Thread(new Runnable() {
    public void run()
    {
        StringBuilder sb = new StringBuilder();

        for(int i=1; i<=10; i++)
        {
            sb.append("Running iteration " + i + "\n");
            final String result = sb.toString();

            Display.getDisplay().asyncExec(new Runnable() {
                public void run()
                {
                    txtLogBox.setText(result);
                }
            });

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();
  • 0
    спасибо отлично работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню