在我的應用程序中,我生成了一個報告。手術時間從幾秒到幾個小時。要通知用戶我使用ProgressMonitorDialog
。 總是在大約70分鐘後拋出InvocationTargetException
。我不知道爲什麼會發生這種情況。ProgressMonitorDialog中的Cancel按鈕和InvocationTargetException
try {
new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
monitor.beginTask("Something...", IProgressMonitor.UNKNOWN);
controller.generate(model);
monitor.done();
}
});
} catch (InvocationTargetException | InterruptedException e) {
logger.error(e);
}
堆棧跟蹤:
java.lang.reflect.InvocationTargetException
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:421)
at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:507)
at pl.edu.prz.allegroapi.gui.report.ProductReport$4.widgetSelected(ProductReport.java:323)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at pl.edu.prz.allegroapi.gui.report.ProductReport.open(ProductReport.java:91)
at pl.edu.prz.allegroapi.gui.MainWindow$2.widgetSelected(MainWindow.java:126)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at pl.edu.prz.allegroapi.gui.MainWindow.open(MainWindow.java:75)
at pl.edu.prz.allegroapi.tasks.CreateGuiTask.doStartup(CreateGuiTask.java:46)
at pl.edu.prz.allegroapi.tasks.CreateGuiTask.access$0(CreateGuiTask.java:42)
at pl.edu.prz.allegroapi.tasks.CreateGuiTask$1.run(CreateGuiTask.java:31)
at java.lang.Thread.run(Unknown Source)
Caused by: org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source)
at org.eclipse.swt.widgets.Dialog.checkParent(Unknown Source)
at org.eclipse.swt.widgets.Dialog.<init>(Unknown Source)
at org.eclipse.swt.widgets.MessageBox.<init>(Unknown Source)
at pl.edu.prz.allegroapi.gui.report.ProductReportController.generate(ProductReportController.java:59)
at pl.edu.prz.allegroapi.gui.report.ProductReport$4$1.run(ProductReport.java:335)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
第二個問題是與工作進度的窗口取消。我知道按下「取消」按鈕,方法isCanceled()
返回true。我嘗試了以下解決方案,但它無法工作,因爲變量退出是最終的。
Boolean exit = false;
display.asyncExec(new Runnable() {
public void run() {
controller.generate(model);
exit=true;
}
});
try {
new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
monitor.beginTask("Something...", IProgressMonitor.UNKNOWN);
while(!monitor.isCanceled() && !exit) {
Thread.sleep(1000);
}
} finally {
monitor.done();
}
}
});
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
對我的答案有何反饋? – Baz
無效訪問問題已得到解決。消息框顯示異常情況下的generate()方法。不幸的是,我們仍然有可能取消長時間操作的問題(問題第二部分描述的問題)。 – Giver
更新了我的答案。 – Baz