2

我有一个 Java 应用程序,其中许多线程正在快速写入 StyledTextBox。在某个时刻,所有线程都被终止。但是,TextBox 继续接收文本可能是因为调度队列有点备份。是否有可能以某种方式强制刷新 EDT,以便在线程终止时立即结束对 TextBox 的更新?

谢谢你,吉姆

4

3 回答 3

5

您可以push()自己的EventQueue子类,如此处所示并添加自己的flush()方法来清空队列。请注意,getNextEvent()如果队列为空,则阻塞,因此请先检查peekEvent()

于 2012-02-08T02:15:15.990 回答
2

使用队列来应用更改的文本,在 EDT 中安排事件,在返回之前使队列为空。一旦线程完成并且 EDT 上的另一个预定事件运行,这将导致“空”事件。

于 2012-02-08T00:51:39.040 回答
1

好的,我找到了解决方案。这个想法是安装一个“验证”监听器,每当文本即将添加到StyledText. 因此,当即将添加文本时(从备份的调度队列中),代码会查找要设置的标志,指示线程是否已终止。如果线程已终止,则忽略文本更新。这允许控件停止更新,同时允许事件队列被耗尽。下面的代码片段解决了这个问题。

txtOutputStyledText控制。
endingThreads是线程终止时的boolean集合。 这似乎是在 SWT 应用程序中处理问题的最简单方法。true

        txtOutput.addVerifyListener(new VerifyListener() {
        public void verifyText(VerifyEvent e)
        {
            if( !endingThreads )
            {
                e.doit = true;
            }
            else
            {
                e.doit = false;
            }
        }
    });
于 2012-02-08T20:01:52.577 回答