Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Беготня по дереву


Автор: Demetrio 21.5.2008, 13:08
Есть стандартый GUI(swt) интерфейс - слева дерево, справа отображение листьев дерева...
Каждый элемент дерева имеет свой метод отображения... все хорошо бы, но как быть с распараллеливанием процессов.. Если быстро бегать по элементам дерева, то начинают запускаться  процессы отображения, а они бывают долгие....то есть процесс получения данных-отрисовки не закончился, а пошел отображаться другой - нововыбранный....Принудительно ждать окончания процесса не хочется....  exception вываливает, когда я removeChildWidgets(right), что правильно...
Как мне правильно прервать метод, который где-то вызывает новый поток....
немного криво описал, но как смог...

метод при смене элемента....

Код

    public void viewContent() {
        WidgetShop.removeChildWidgets(right);
        getSelectionObject().view(right);
        right.layout(true);
    }


public void setAction() {
        addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                TreeObject treeObject = getSelectionObject();
                if (treeObject == null) return;
                if( idBranch == treeObject.id ) return;
                idBranch = treeObject.id;
                SwtTsm.slm.getProgressMonitor().setCanceled(true); // not working
                SwtTsm.slm.getProgressMonitor().done(); // not working
                viewContent();
            }
        });
    }



метод получения данных для отображения...

Код

protected ArrayList<String> getRequest(final String command) {
        final ArrayList<String> list = new ArrayList<String>();
        try {
            ModalContext.run(new IRunnableWithProgress() {
                public void run(IProgressMonitor progressMonitor) {
                    progressMonitor.beginTask("Waiting...", IProgressMonitor.UNKNOWN);
                    getRequestMain(command, list);
                    progressMonitor.done();
                }
            }, true, SwtTsm.slm.getProgressMonitor(), SwtTsm.shell.getDisplay());
        } catch (InterruptedException e) {
            System.out.println("exp1");
        } catch (InvocationTargetException e) {
            System.out.println("exp2");
        } finally {
            SwtTsm.slm.setMessage("Ready");
        }
        return list;
    }




Автор: w1nd 21.5.2008, 23:44
Прервать насильственно - никак. В процессе отображения следует проверять IProgressMonitor.isCancelled(), а все запросы к дереву (в том числе удаление и добавление) ставить в ту же очередь, что и вытаскивание данных для отображения.

Автор: Demetrio 22.5.2008, 09:52
Да, собстно я расстался с мыслью о асинхронности....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)