我正在编写一个使用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())与发送方完全同步,并按时停止了输出!蚀setText()如何使其StyledText

最佳答案

两件事情:

使用asyncExec而不是syncExec-这将使记录器本身快速运行。但是,如果添加记录程序条目的速度快于UI线程无法处理的速度,则事件队列将变得越来越大……并且您将获得与概述相同的缓慢响应……

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


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


这在我的一个应用程序中效果很好。

关于java - 从其他线程高速使用StyledText.append(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15701302/

10-10 11:16