确定Matlab是否有可用的显示器



我想在Matlab应用程序中使用questdlg来提示用户反馈。如果没有显示可用(例如,在非转发的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

首先,这里有一个相关的启动选项列表,以及它们所支持的操作系统(否则它们将被忽略并且不起作用):

  • -nojvm [UNIX]:启动没有JVM,任何需要Java失败(包括处理图形功能)
  • -nodisplay [UNIX]:不使用x窗口显示,忽略$DISPLAY环境变量
  • -noFigureWindows [ALL]:无头模式,不显示任何图形
  • -nodesktop [ALL]: IDE未启动,命令提示符代替

由于我只能访问Windows安装的MATLAB,如果有人可以在UNIX上复制以下实验,通过使用-nodisplay选项启动MATLAB,或者在没有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

参考:

  • 更改为-nojvm启动选项
  • 更改为-nodisplay和-noFigureWindows启动选项
  • usejava, javachk
  • matlabwindows, matlabunix
  • which -all warnfiguredialog.m

这个MATLAB新闻组线程建议检查根对象'ScreenSize'属性的第三和第四个值将告诉您是否有显示可用。我现在不能测试它,但是你可以试着把它添加到你的代码中:

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

不确定这是否有效,但您可以尝试使用'desktop'参数的usejava函数

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

@Amro在本页上的回答很好,但是parfor循环中工作。事实上,在这种情况下,基于usejava()feature('ShowFigureWindows')的解决方案都不起作用,因为一旦parfor循环开始,环境就会发生变化。

一个可靠的方法是@ grookie的答案。具体来说:

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循环改变了上下文,但这种情况并不常见)。

相关内容

  • 没有找到相关文章