Отзывчивый графический интерфейс MATLAB без вызова drawow() напрямую
Факты о MATLAB:
- Пользовательский интерфейс MATLAB - это Java Swing.
- MATLAB обладает отличной совместимостью с Java, можно инициализировать объекты Java и вызывать их методы непосредственно из кода MATLAB, даже возможно передать в MATLAB определенные слушатели Java!
Моя проблема:
MATLAB не предлагает фоновые потоки, поэтому для реагирования MATLAB UI мы должны вызвать функцию drawnow, которая сбрасывает очередь Swing EDT, см. также здесь и здесь. Это известный факт, настолько хороший.
Но теперь у меня есть клиент, чей код, который выполняет вычисление, является p файлом MATLAB (зашифрованным), поэтому у меня нет доступа к коду для размещения там drawnow
.
Неудачная попытка:
Я попробовал разворачивать таймер, чтобы выполнить вызов вызова drawnow
, но он, похоже, не работает. Для самого запуска таймер drawnow
должен запускать свои обратные вызовы.
EDIT: В конце я реализовал графический интерфейс с .NET/WPF, работающий на другом потоке, поэтому он всегда остается отзывчивым и выглядит намного лучше, чем оригинальный MATLAB.
Ответы
Ответ 1
Я не знаю, можно ли это сделать правильно. Я никогда не нашел способ получить эффект оттянутого в середине файла mex, и я бы предположил, что эта ситуация похожа. Но в любом случае это невероятно грязный хак: D. Если у вас есть p файл, вы можете запустить:
profile on;
pfile();
profile viewer;
и получить представление о том, какие функции вызывает pfile(). Если код вызывает любые встроенные функции (например, disp) или любую функцию, к которой вы имеете доступ к исходному коду, вы можете создать свою собственную версию этого файла дальше по пути, который будет вызываться p файлом, например,
function disp(X)
if (toc > 5)
drawnow;
tic;
end
builtin('disp', X);
Это будет вызывать не более одного раза каждые 5 секунд, хотя это будет не очень полезно, если disp не будет вызван регулярно. Если вы не можете найти встроенное для переопределения, вы можете использовать любую другую функцию и просто вставить часть втягивания вверху, например:
function primes(N)
if (toc > 5)
drawnow;
tic;
end
The rest of the original primes.m here.
Ответ 2
Просто идея. Вы можете создать файл jar из p файла, используя конструктор Matlab для java.
Изнутри Java вы можете сделать расчет теперь в отдельном потоке.