c – 如果Matlab以GUI开始,如何从MEX文件中检查

我已经尝试自己找到这个问题的答案,并且
asked my question at Matlab Central没有得到任何回复.现在我希望你们中的一个可以帮助我解决我的问题.这是我的(改进的)问题:

标题已经很好地描述了我必须要做的事情:我必须从MEX文件中检查Linux上的Matlab R2013a是否已经启动了GUI.

背景:我运行一个C/C++程序(我可以使用这些来源,但不允许更改它们,只有在必要时添加新文件!)来自Matlab.我写了几个(附加的)MEX文件,允许程序使用mexCallMATLAB来评估m文件.现在我需要知道在哪里我必须指导C/C++程序的输出,这取决于Matlab是否已经启动了GUI.我需要从我的MEX文件中调用的函数中获取此信息.到目前为止,我只能通过更改硬编码参数来重定向C/C++程序的输出,但我已经可以将它指向正确的输出,这意味着没有控制台,或者带有GUI的Matlab命令窗口.

直到R2012x,可以使用C-function isatty()进行检查,但是从R2013a开始,此检查不再起作用,这意味着Matlab似乎始终只从控制台启动,即使它已经启动了GUI.

你们中的任何人都知道这样的功能,还是我的问题的另一种解决方案?

提前谢谢大家!

问候,mindm49907

最佳答案 通过mexCallMATLAB调用usejava(‘desktop’).从
the docs for usejava开始:

Syntax

tf = usejava(feature)

Java feature, specified as one of these values:

'awt' Java GUI components in the Abstract Window Toolkit (AWT)
components are available.

'desktop' MATLAB interactive desktop is running.

'jvm' Java Virtual Machine software (JVM) is running.

'swing' Swing components (Java lightweight GUI components in the Java Foundation Classes) are available.

atDesktop.cpp

#include "mex.h"

bool atMLDesktop()
{
    mxArray *tf(0);
    mxArray *permuteRHSArgs = mxCreateString("desktop");
    mexCallMATLAB(1, &tf, 1, &permuteRHSArgs, "usejava");

    return mxIsLogicalScalarTrue(tf);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    plhs[0] = mxCreateLogicalScalar(atMLDesktop());
}

测试

从MATLAB桌面:

>> atDesktop
ans =
     1
>> tf = atDesktop
tf =
     1

从终端或裸命令窗口:

» tf = atDesktop
tf =
     0

您也可以使用与上面相同的方式在MATLAB中检查com.mathworks.mde.desk.MLDesktop.getInstance.getMainFrame,但MathWorks支持usejava.

点赞