Подтвердить что ты не робот

Отзывчивый графический интерфейс 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.

4b9b3361

Ответ 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 вы можете сделать расчет теперь в отдельном потоке.