我有一个Java应用程序,其中许多线程正在快速写入StyledTextBox。在某些时候,所有线程都被终止。但是,TextBox继续接收一些文本,大概是因为调度队列有点备份。是否有可能以某种方式强制刷新EDT,以便在线程终止时对TextBox的更新立即结束?
谢谢你, 吉姆
答案 0 :(得分:5)
您可以push()
您自己的EventQueue
子类,如图所示here,并添加您自己的flush()
方法来清空队列。请注意,如果队列为空,getNextEvent()
会阻塞,因此请先检查peekEvent()
。
答案 1 :(得分:2)
使用队列来应用已更改的文本,在返回之前将事件安排在队列为空的EDT中。一旦线程结束并且EDT上的另一个预定事件运行,这将导致“空”事件。
答案 2 :(得分:1)
好的,我找到了解决方案。我们的想法是安装一个“验证”监听器,只要将文本添加到StyledText
,就会调用该监听器。因此,当即将添加文本时(从备份的调度队列中),代码会查找要设置的标志,指示线程是否已被终止。如果线程已终止,则忽略文本更新。这允许控件在允许排空事件队列的同时停止更新。以下代码段解决了这个问题。
txtOutput
是StyledText
控件
当线程被终止时,endingThreads
是boolean
设置为true
这似乎是在SWT应用程序中处理问题的最简单方法。
txtOutput.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent e)
{
if( !endingThreads )
{
e.doit = true;
}
else
{
e.doit = false;
}
}
});