Отзывчивый графический интерфейс MATLAB без прямого вызова drawnow () - PullRequest
13 голосов
/ 03 апреля 2012

Факты о MATLAB:

  1. Интерфейс MATLAB - это Java Swing.
  2. MATLAB имеет отличную совместимость с Java, можно инициализировать объекты Java и вызыватьих методы непосредственно из кода MATLAB, можно даже передать в Java прослушиватели, определенные в MATLAB!

Моя проблема:

MATLAB не предлагает фоновые потокипоэтому, чтобы сделать MATLAB UI отзывчивым, мы должны вызвать функцию drawnow , которая очищает очередь Swing EDT, см. также здесь и здесь .Это известный факт, пока что все хорошо.

Но теперь у меня есть клиент, чей код, который выполняет вычисления, представляет собой p-файл MATLAB (зашифрованный), поэтому у меня нет доступа к коду для установки drawnow Там.

Неудачная попытка:

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

EDIT: В конце я реализовал графический интерфейс с .NET / WPF, работающим в другом потоке, поэтому он всегда остается отзывчивым и выглядит намного лучше, чеморигинал MATLAB.

Ответы [ 2 ]

7 голосов
/ 07 апреля 2012

Я не знаю, можно ли это сделать правильно. Я никогда не находил способ получить эффект drawnow в середине mex-файла, и я предполагаю, что эта ситуация похожа. Но в любом случае это невероятно грязный взлом: D. Если у вас есть p-файл, вы можете запустить:

profile on;
pfile();
profile viewer;

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

function disp(X)
  if (toc > 5)
    drawnow;
    tic;
  end
  builtin('disp', X);

Это будет вызывать drawnow не чаще, чем раз в 5 секунд, хотя это будет бесполезно, если не вызывать disp регулярно. Если вы не можете найти встроенную функцию для переопределения, вы можете использовать любую другую функцию и просто вставить часть drawnow вверху, например:

function primes(N)
  if (toc > 5)
    drawnow;
    tic;
  end
  The rest of the original primes.m here.
2 голосов
/ 06 апреля 2012

Просто идея.Вы можете собрать JAR-файл из p-файла, используя Matlab Builder для Java.Изнутри Java вы можете сделать расчет сейчас в отдельном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...