Определите, есть ли у Matlab доступный дисплей - PullRequest
20 голосов
/ 20 июля 2011

Я хотел бы использовать questdlg в приложении Matlab для получения обратной связи с пользователем. Если нет доступного отображения (например, в течение не пересланного ssh-сеанса или если Matlab запускается с -nodisplay), questdlg завершается неудачно (см. Ниже). Есть ли способ определить, доступен ли дисплей из кода Matlab, чтобы я мог вернуться к текстовой альтернативе?

Если Matlab запускается с опцией -nodisplay, qusetdlg выдает следующий вывод и «зависает» Matlab (в uiwait). Хотя пользователь может использовать Ctl-C для выхода, нет никаких указаний на эту опцию, и наивный пользователь может заключить, что Matlab действительно завис:

>> questdlg('test','test')
Warning: This functionality is no longer supported under the -nodisplay and
-noFigureWindows startup options. For more information, see "Changes to
-nodisplay and -noFigureWindows Startup Options" in the MATLAB Release Notes.
To view the release note in your system browser, run
web('http://www.mathworks.com/access/helpdesk/help/techdoc/rn/br5ktrh-1.html#br5ktrh-3',
'-browser') 
> In uitools/private/warnfiguredialog at 19
  In dialog at 37
  In questdlg at 117
Warning: This functionality is no longer supported under the -nodisplay and
-noFigureWindows startup options. For more information, see "Changes to
-nodisplay and -noFigureWindows Startup Options" in the MATLAB Release Notes.
To view the release note in your system browser, run
web('http://www.mathworks.com/access/helpdesk/help/techdoc/rn/br5ktrh-1.html#br5ktrh-3',
'-browser') 
> In uitools/private/warnfiguredialog at 19
  In uiwait at 41
  In questdlg at 378

Ответы [ 5 ]

27 голосов
/ 21 июля 2011

Прежде всего, вот список соответствующих параметров запуска, а также операционная система, в которой они поддерживаются (в противном случае они игнорируются и не действуют):

  • -nojvm [UNIX]: запуск без JVM, все, что требует Java, не работает (включая функциональность Handle Graphics)
  • -nodisplay [UNIX]: не использует отображение X-Window, игнорирует $DISPLAY переменную среды
  • -noFigureWindows [ВСЕ]: безголовый режим, никакие цифры не будут отображаться
  • -nodesktop [ВСЕ]: IDE не запущена, вместо командной строки

Поскольку у меня есть доступ толькодля установки MATLAB в Windows, я был бы благодарен, если бы кто-нибудь смог повторить следующие эксперименты в UNIX, запустив MATLAB с параметром -nodisplay или запустив без установленной переменной окружения DISPLAY, в сочетании с -nodisplay и-nojvm options.

matlab -nodesktop

» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
     1     1     1     0
» get(0,'ScreenSize')
ans =
           1           1        1600        1024
» feature('ShowFigureWindows')
ans =
     1
» questdlg('?','?');
[works fine]
» plot(1:10)
[works fine]

matlab -noFigureWindows

» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
     1     1     1     1
» get(0,'ScreenSize')
ans =
           1           1        1600        1024
» feature('ShowFigureWindows')
ans =
     0
» questdlg('?','?');
Warning: This functionality is no longer supported ....
» plot(1:10)
[no plot]

matlab -nodesktop -noFigureWindows

» [usejava('jvm'),usejava('awt'),usejava('mwt'),usejava('Desktop')]
ans =
     1     1     1     0
» get(0,'ScreenSize')
ans =
           1           1        1600        1024
» feature('ShowFigureWindows')
ans =
     0
» questdlg('?','?');
Warning: This functionality is no longer supported ....
» plot(1:10)
[no plot]

В заключениеn, это тест, который я бы использовал для получения согласованных результатов на разных платформах:

if usejava('jvm') && ~feature('ShowFigureWindows')
    %# use text-based alternative (input)
else
    %# use GUI dialogs (questdlg)
end

Некоторые ссылки:

2 голосов
/ 21 июля 2011

Эта ветка группы новостей MATLAB предполагает, что проверка третьего и четвертого значений корневого объекта 'ScreenSize' свойство покажет вам, доступен ли дисплей. Я не могу проверить это в данный момент, но вы можете попробовать добавить это в ваш код:

screenSize = get(0,'ScreenSize');
if isequal(screenSize(3:4),[1 1])
  %# Use text-based alternative
else
  %# Call questdlg
end
1 голос
/ 14 мая 2015

@ ответ Амро на этой странице в порядке, но не работает в циклах parfor. Фактически, ни одно из решений на основе usejava() и feature('ShowFigureWindows') не работает в этом случае, поскольку среда изменяется после запуска цикла parfor.

Надежный способ - это @ gnovice ответ . В частности:

parfor k=1:N
    scr = get(0,'ScreenSize');
    if isequal(scr(3:4),[1 1])
        % text-based version
    else
        % GUI version
    end
end

В качестве альтернативы, вы можете применить любое решение до входа в цикл parfor, сохранить результат в переменной и затем проверить только эту переменную в цикле parfor:

scr = get(0,'ScreenSize');
istext = isequal(scr(3:4),[1 1]);

% or

istext = ~usejava('jvm') || ~feature('ShowFigureWindows');

parfor k=1:N
   if istext
       % text-based version
   else
       % GUI version
   end
end

Однако, в зависимости от вашего приложения, это может быть ненадежно (например, если цикл parfor меняет контекст, но это редко).

1 голос
/ 26 февраля 2015

is_gui_mode = usejava('desktop') && usejava('awt');

1 голос
/ 20 июля 2011

Не уверен, что это сработает, но вы можете попробовать функцию usejava с параметром desktop.

...