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