您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

定期更新SWT会导致GUI冻结

定期更新SWT会导致GUI冻结

任何更改UI对象的SWT操作都必须在SWT用户界面线程上运行。

在您的情况下,该text.setText(i.toString());行是SWT UI操作,并且在其他线程中运行。

您可以使用的asyncExecsyncExec方法Display在UI线程中运行一些代码。因此,请替换:

text.setText(i.toString());

final String newText = i.toString();
Display.getDefault().asyncExec(() -> text.setText(newText));

(这是假设您使用的是Java 8)。

使用asyncExec将异步进行UI更新。syncExec如果您想暂停线程直到更新完成,请改用。

如果您使用的是Java 7或更早版本,请使用:

 final String newText = i.toString();
 Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
      text.setText(newText);
    }
 });

请注意,您还应该检查是否Shell正在处理该线程并停止后台线程。如果不这样做,则在关闭应用程序时会出现错误。您的代码增量i也是错误的。该线程有效:

new Thread(() -> {
    for (int i = 1; true; i++) {
        try {
            Thread.sleep(1000);
        } catch (final InterruptedException e) {
            return;
        }

        if (shell.isDisposed())  // Stop thread when shell is closed
          break;

        final String newText = Integer.toString(i);
        Display.getDefault().asyncExec(() -> text.setText(newText));
    }
}).start();
其他 2022/1/1 18:31:29 有580人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶