我正在编写一个使用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/