내 응용 프로그램에서 보고서를 생성합니다. 작업 시간은 몇 초에서 최대 몇 시간입니다. 사용자에게 알리기 위해 ProgressMonitorDialog
을 사용합니다. 항상 약 70 분 후 InvocationTargetException
이 던졌습니다. 왜 이런 일이 일어나는지 모르겠습니다.ProgressMonitorDialog 및 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() 메소드가 MessageBox로 표시되었습니다. 불행히도, 우리는 여전히 긴 작업을 취소 할 수있는 가능성에 문제가 있습니다 (문제의 두 번째 부분에 설명 된 문제). – Giver
내 대답이 업데이트되었습니다. – Baz