MATLAB: 设置非Java命令窗口的标题

3

问题

如何为没有桌面和Java的MATLAB窗口设置命令窗口标题?

  • 主要关注的Matlab版本:2012a及更高版本
  • 需要的操作系统:主要是Windows(XP);最好是更通用的操作系统
  • 理想解决方案:在下面描述的“mat”函数生成的结果窗口中设置标题。
  • 备选方案:在下面描述的“matj”函数生成的窗口中设置命令窗口标题。

背景

我有匿名函数可启动“裸机MATLAB”窗口(每个窗口从我的主MATLAB窗口的终端执行)。

mat  = @(sCmd) system(['matlab.exe -nodesktop -nosplash -nojvm -r "' sCmd ';" &']);
matj = @(sCmd) system(['matlab.exe -nodesktop -nosplash -r "' sCmd ';" &']);

"matj"窗口比“mat”窗口更占用RAM内存。

我知道一些在启用Java的窗口中设置标题的技巧,例如以下方法(有趣的是,这个方法在“matj”窗口中没有起作用):

cmdtitle = @(sT) com.mathworks.mde.desk.MLDesktop.getInstance.getClient('Command Window').getTopLevelAncestor.setTitle(sT)

为什么需要这个/我用它来做什么

我将内存密集型的非绘图MATLAB任务分配到这些裸机窗口中,这些窗口是从“主”MATLAB窗口(完全加载了java和其他功能)中分配的。设置这些窗口的标题可以让我对该窗口的分配任务进行视觉标记。

此外,能够扩展这些裸机窗口中显示的文本缓冲区将会很有帮助(在我的电脑上似乎限制在大约500行)。解决标题设置问题的方法是一旦裸机窗口显示出来,向终端显示一个字符串,但是有限的缓冲区防止第一行持久存在。

如果您有更好/替代的方法来实现这些目标,我们将不胜感激,并感谢您花费时间阅读/回答。谢谢并祝您一天愉快。

1个回答

2
听起来你正在做类似批处理的事情。你可能需要研究一下Matlab并行计算工具箱。最新版本的Matlab允许你把电脑当作一个小型计算集群,向它发送批处理作业,这可以很好地解决你的问题。
或者,如果你没有这个许可证,你可以通过Windows API设置窗口标题,并将其封装在mexFunction中。由于它很有趣,我已经编写了一些代码来实现这个功能:
//Include the windows api functions
#include <Windows.h>
//include the matlab mex function stuff
#include "mex.h"

DWORD processID; //the process id of the current matlab

//Callback function, this is the bit that sets the window text
BOOL CALLBACK SetTitleEnum( HWND hwnd, LPARAM lParam ) {    
    DWORD dwID ;
    //get the process of the window this was called on
    GetWindowThreadProcessId(hwnd, &dwID); 
    //if it is our matlab instance, set the title text
    if(dwID == processID) SetWindowText(hwnd, (const char*) lParam);
    return true;
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{
    //get the process id of this instance of matlab
    processID = GetCurrentProcessId(); 

    if (nrhs > 0) { //if we have been given a title
        char * title = mxArrayToString(prhs[0]); //get it as a char* string     
        //get all open windows and call the SetTitleEnum function on them
        EnumWindows((WNDENUMPROC)SetTitleEnum, (LPARAM) title);        
        mxFree(title);//free the title string.
    }
}

我使用Visual Studio 2010 Express在Matlab中编译了上述代码,无论是限制命令行版本还是正常的完整桌面版Matlab,它都可以正常工作。


非常感谢您提供改进技术的建议并为我所需的实现提供方法。我刚刚测试了MEX代码,它提供了所需的功能。谢谢! - blake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接