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

Определите, есть ли у Matlab дисплей

Я хотел бы использовать 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
4b9b3361

Ответ 1

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

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

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

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]

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

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

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

Ответ 2

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

screenSize = get(0,'ScreenSize');
if isequal(screenSize(3:4),[1 1])
  %# Use text-based alternative
else
  %# Call questdlg
end

Ответ 3

Не уверен, что это сработает, но вы можете попробовать usejava с параметром "desktop".

Ответ 4

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

Ответ 5

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

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

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 изменяет контекст, но это необычно).