从其他线程高速使用StyledText.append()

时间:2013-03-29 10:18:00

标签: java multithreading swt ui-thread

我正在使用SWT编写一个桌面应用程序,它以高速率从网络接收日志数据(接近每秒100个数据包)。每个数据包都包含一行必须附加到StyledText的行。由于我在非UI线程中收到数据包,我必须使用此代码:

    display.asyncExec(new Runnable() {

        @Override
        public void run() {
            txtLog.append(log);
            txtLog.setTopIndex(txtLog.getLineCount() - 1);
        }
    });

但是这段代码使我的Logger太慢,我的记录器输出与发送者不同步。例如,我停止发送设备,我的程序日志输出在3分钟后停止!!但是,eclipse控制台输出(System.out.println())与发送器完全同步并且按时停止输出! eclipse setText()如何StyledText

1 个答案:

答案 0 :(得分:2)

两件事:

使用asyncExec而不是syncExec - 这将使您的记录器自动变速。但是如果记录器条目的添加速度比UI线程可以处理的速度快,那么事件队列将变得越来越大......并且你将得到与你概述的相同的慢响应......

StyledText的所有更改 - 包括附加 - 都相当昂贵。因此,您可能还需要记录器和StyledText小部件之间的中间缓冲区:

  • 记录器添加到缓冲区
  • 如果缓冲区 为空,则执行asyncExec
  • asyncExec Runnable将附加当前缓冲区内容并清空缓冲区

这在我的一个应用程序中非常有用......