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 行)。标题设置问题的解决方法是在准系统窗口显示后向终端显示一个字符串,但有限的缓冲区会阻止第一行持续存在。

非常感谢有关实现这些目标的更好/替代方法的建议,以及您阅读/回答的时间。谢谢你,美好的一天。

4

1 回答 1

2

听上去你正在做类似于批处理的事情。您可能想查看Matlab Parallel Computing Toolbox。这个和 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 中,它对我来说都很好。

于 2013-04-18T21:09:49.793 回答