gpt4 book ai didi

c++ - 如果 Matlab 以 GUI 启动,如何从 MEX 文件中检查

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:59 24 4
gpt4 key购买 nike

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

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

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

直到 R2012x,可以使用 C++ 函数 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

关于c++ - 如果 Matlab 以 GUI 启动,如何从 MEX 文件中检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25132883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com