0

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

    display.asyncExec(new Runnable() {

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

但是这段代码让我的 Logger 太慢了,而且我的 logger 的输出与 sender 不同步。例如,我停止了发送方设备,我的程序日志输出在 3 分钟后停止!!但是,eclipse 控制台输出(System.out.println())与发送方完全同步并按时停止输出!eclipsesetText()StyledText怎么回事?

4

1 回答 1

2

两件事情:

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

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

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

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

于 2013-04-01T15:43:28.380 回答