gpt4 book ai didi

java - 在 UI 线程中执行长时间操作时的 SWT 进度对话框?

转载 作者:行者123 更新时间:2023-12-02 05:34:06 24 4
gpt4 key购买 nike

我有一个很长的操作,无法从 SWT UI 线程中移出。我知道,这很恶心,但就是这样。我想为所述长时间操作显示某种进度条。我已经修改了 org.eclipse.jface.dialogs.ProgressMonitorDialog。我没有给它 IRunnableWithProgress,因为正如我所说,长操作位于 UI 线程中。因此,我们有类似的东西......

Shell shell = new Shell();
ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(shell);
progressDialog.open();
IProgressMonitor progressMonitor = progressDialog.getProgressMonitor();
int workLoad = 10;
progressMonitor.beginTask(message, workLoad);
for(int i = 0; i < workLoad; ++i) {
progressMonitor.worked(1);
progressMonitor.subTask("Subtask " + (i+1) + " of "+ workLoad + "...");
if(progressMonitor.isCanceled()) {
break;
}
// Do some work.
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressMonitor.done();
progressDialog.close();

这可行,但显然更新不顺利,有时移动和单击取消很滞后。我想也许我可以通过创建一个包含必需的线程来手动更新此实例中的 UI...

while(!shell.isDisposed()) {
if(!display.readAndDispatch()) {
display.sleep();
}
}

...在 run 方法中,但令我懊恼的是我遇到了...

Exception in thread "Thread-16" org.eclipse.swt.SWTException: Invalid thread access

事实证明,您不能在任何旧线程中执行此操作,这些调用必须源自 UI 线程。回到第一个方 block 。

有人知道我是否可以欺骗系统吗?就像让我的小线程看起来像是 UI 线程?或者任何其他建议都会很酷。

谢谢,jb

最佳答案

拥有响应式 UI 的唯一方法是调用 Display.readAndDispatch()在 UI 线程中,句号。通常,RCP 会为您处理,或者 main你的应用程序的方法,但如果你在 UI 线程上运行某些东西,它们就不能,所以你必须这样做。

请注意,只能有一个 UI 线程,因此,如果您可以“让我的小线程看起来像是 UI 线程”,那么您原来的长时间运行任务将不会在 UI 线程中运行毕竟。

关于java - 在 UI 线程中执行长时间操作时的 SWT 进度对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25192604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com