2013-03-29 18 views
0

我写使用以高速率(每秒接近100包)从网络接收的日志数据SWT桌面应用程序。每个数据包包含一行必须附加到StyledText。自从我接受非UI线程包,我要使用此代码:使用StyledText.append()从其他线程以高速

display.asyncExec(new Runnable() { 

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

但这个代码使我的记录器太慢了,我的记录器的输出端不与发送者同步。例如我停止发送方设备和3分钟!,但是,Eclipse控制台输出(System.out.println())是完全同步与发送方后,我的节目日志输出停止,并停止在时间输出! eclipse setText()它的StyledText怎么样?

回答

2

两件事情:

使用asyncExec而非syncExec - 这会让你快速记录器本身。但是,如果记录条目添加快于UI线程的处理能力,那么事件队列只会越来越大......,你将有你列出的相同反应慢......

全部变为包括附加到它的StyledText相当昂贵。因此,您可能还需要和你的记录之间的中间缓冲的StyledText部件:

  • 记录器增加了缓冲
  • 如果缓冲区空的,然后做一个asyncExec
  • asyncExecRunnable会附加当前缓冲区内容并清空缓冲区

这在我的一个应用程序中运行得很好...

+0

感谢您的回复。直到我今天登录后,我对这篇文章感到失望。关于'asyncExec()'你是对的。其实我在我的代码中使用了这个方法,而不是'syncExec()'。在这里打字我错了。在回答这个问题之前,我在我的应用程序中使用了一些缓冲区,并且日志文本与发件人(50fps)同步,但任务管理器永久显示我的应用程序的CPU使用率为16%。我怎么能解决它? – MHM

+0

“日志文本与发件人同步(50fps)”?? –

+0

缓冲后我的意思是,我使用的调度器来运行'asyncExec()'每20毫秒(50帧),并追加到缓冲部件。但reuslt是巨大的CPU使用! – MHM