繁体   English   中英

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

[英]How to check from MEX-file if Matlab started with GUI

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

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

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

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

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

提前谢谢大家!

问候,mindm49907

通过mexCallMATLAB调用usejava('desktop') 来自usejava的文档

句法

tf = usejava(feature)

...

Java功能,指定为以下值之一:

'awt'抽象窗口工具包(AWT)组件中'awt' Java GUI组件可用。

'desktop' MATLAB交互式桌面正在运行。

'jvm'虚拟机软件(JVM)正在运行。

'swing' swing'Swing组件(Java基础类中的Java轻量级GUI组件)可用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM