Как я могу обновить элемент GUI из функции, интенсивно использующей процессор? - PullRequest
1 голос
/ 25 декабря 2011

Вот моя проблема, у меня есть GUI и функция (func1), написанная вне .m файла моей фигуры.У меня также есть кнопка на моем графическом интерфейсе, которая при нажатии запуска func1, теперь эта функция очень интенсивно использует процессор и может занять много времени перед финшем, поэтому я бы хотел, чтобы функция могла что-то написать на моем графическом интерфейсе (например,статический текст, например.).

Моей первой мыслью было заставить func1 записать некоторую информацию в текстовый файл, который GUI мог бы прочитать, но для этого мне нужно какое-то многопоточное программирование со стороны GUI, и выглядетьMatlab не имеет ничего подобного.

Во-вторых, я попытался заставить func1 вызывать функцию обновления (сообщения), в отличие от файла .m, связанного с GUI, но он не работал, потому что обновлениеподфункция и кажется, что нет способа вызвать подфункцию вне файла, который ее содержит.

Может кто-нибудь помочь мне с этим?извините за мой плохой английский.

1 Ответ

2 голосов
/ 25 декабря 2011

Обход объекта, который обновляет пользовательский интерфейс, работает с ним как ссылка.

classdef WindowUpdater < handle
    properties(Access=private)
        textBox;
    end

    methods(Access=public)

        function this = WindowUpdater(textBox)
            this.textBox = textBox;
        end

        function Update(this,st)
            set(this.textBox,'String',st);
            drawnow();
        end        
    end

end

Инициализируйте его с помощью своего текста uicontrol

h = uicontrol('Style','text');
wu = WindowUpdater( h);

Напишите вам интенсивную функцию как:

function foo(arg1,arg2,wu)
     %Do some stuff
     wu.Update('Hello world!');
     %Do some more stuff
     wu.Update('Hello world has finished!');
end

Этот метод имеет огромное преимущество SW:

  • Ваша логика кода отделена от обновлений графического интерфейса: вы можете заменить WindowUpdater другим MyNewUpdater, который будет писать в строку консоли, ничего не делать и т. Д.
...