我有一个长期运行的任务(打印整个摆动框架9999+次)。不幸的是,它只在事件派发线程中运行良好。所以我需要阻止gui。我想至少向用户显示进度。我的第一次天真尝试不起作用:
var array = [NSDate]()
array.sort { $0 < $1 }
这有什么不对?没有任何事情发生。
UPD : 这是一个示例,它说明了问题:
// this allo happens IN event dispatch thread
for (int i = 0; i < 9999; i++) {
doLongEDTJob(i);
myProgressBar.setValue(myProgressBar.getValue() + 1);
myProgressBar.repaint();
}
答案 0 :(得分:1)
不幸的是它只在事件派发线程中运行良好。所以我需要阻止gui。我想至少向用户显示进度。
您的要求存在冲突 - 如果您使用长时间运行的进程阻止事件线程,这将阻止事件线程进行绘制,从而阻止更新GUI - 因此您拥有XY Problem当解决方案完全使用不同的方法时,你问如何解决“X”。
问题的真正解决方案是弄清楚为什么你无法从EDT运行长时间运行的任务然后更改任务以便它能够很好地运行关闭 Swing事件线程,然后一旦完成,在事件线程上设置JProgressBar的值,通常最好使用SwingWorker完成。有关如何执行此操作的更详细答案,您需要显示和发布更多内容,最好是Minimal, Complete, and Verifiable example