ProgressMonitorDialog и взаимодействие с пользователем

Я использую ProgressMonitorDialog с IRunnableWithProgress читать файл в фоновом режиме.

Если во время обработки этого файла возникает ошибка (данные не соответствуют ожиданиям), я хотел бы спросить пользователя, хочет ли он перейти к следующей строке.

Проблема в том, что теперь, чтобы спросить пользователя, хочет ли он продолжить, мне нужно показать диалог. Отображение диалога из не-пользовательского интерфейса предполагает использование Display.asyncExec() или же Display.syncExec(), Чтобы вернуть результат (пользовательское решение) в фоновый поток, я должен был бы использовать обратный вызов.

Теперь проблема в том, что когда я получаю результат в обратном вызове в фоновом потоке, как я могу продолжить чтение файла? Или, другими словами, как я могу приостановить выполнение фонового потока, пока не вернется обратная связь, а затем продолжить ее?

Я открыт для предложений и готов реструктурировать свое окружение, чтобы приспособиться к такому поведению.

1 ответ

Решение

Dislay.syncExec блокирует поток, из которого вы вызываете его, так что вы можете сделать что-то вроде:

final int[] result = new int[] {0};

display.syncExec(new Runnable() {
    public void run() {
        Shell shell = display.getActiveShell();

        MessageDialog dialog = .... your message dialog

        result[0] = dialog.open();
    }
});

... dialog return code in result[0]

(сильно адаптировано из кода в org.eclipse.equinox.internal.p2.ui.ValidationDialogServiceUI)

Другие вопросы по тегам