Определите, есть ли у 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
Ответы
Ответ 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 изменяет контекст, но это необычно).