MATLAB: définir le titre de la fenêtre de commande non Java

Question

Comment définir le titre de la fenêtre de commande pour une fenêtre MATLAB lancée sans bureau et sans Java?

  • Matlab ver d’intérêt principal: 2012a et plus tard
  • Système d’exploitation requirejs: Windows (XP) principalement; quelque chose de plus général préféré
  • Solution idéale: définit le titre dans la fenêtre résultante produite par la fonction “mat” décrite ci-dessous.
  • Solution alternative: définissez le titre de la fenêtre de commande dans la fenêtre produite par la fonction “matj” décrite ci-dessous.

Contexte

J’ai des fonctions anonymes pour lancer des fenêtres “barebones MATLAB” (chacune s’exécutant à partir du terminal de ma fenêtre principale MATLAB).

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

La fenêtre “matj” consum plus de mémoire vive que celle produite par “mat”.

Je suis au courant des techniques pour définir le titre dans les fenêtres compatibles Java, telles que ma suite (qui, curieusement, ne fonctionnait PAS dans la fenêtre “matj”):

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

Pourquoi j’ai besoin de ça / de ce que je fais avec ça

Je divise les tâches MATLAB non compliquées nécessitant beaucoup de mémoire sur ces fenêtres barebones à partir d’une fenêtre MATLAB “maître” (entièrement chargée avec java et autres cloches / sifflets). En définissant le titre sur ceux-ci, je pourrais leur donner une étiquette visuelle concernant la tâche assignée à cette fenêtre.

En outre, il serait utile de pouvoir étendre le tampon de texte affiché dans ces fenêtres barebone (il semble qu’elles soient limitées à environ 500 lignes sur mon ordinateur). Une solution à ce problème consiste à afficher une chaîne au terminal une fois la fenêtre barebones affichée, mais un tampon limité empêche la persistance de cette première ligne.

Les suggestions sur les moyens les meilleurs / alternatifs pour atteindre ces objectives sont les plus appréciées, tout comme votre temps de lecture / réponse. Merci et bonne journée.

Au son de cela, vous faites quelque chose qui s’apparente au traitement par lots. Vous voudrez peut-être regarder dans la boîte à outils Matlab Parallel Computing . Les versions les plus récentes de cette version et de Matlab vous permettent de traiter votre ordinateur comme un mini-cluster de calcul et d’y exécuter des tâches par lot, ce qui pourrait résoudre votre problème avec précision.

Sinon, si vous n’avez pas de licence pour cela, vous pouvez passer par la fenêtre Windows api pour définir le titre de la fenêtre et l’enregistrer dans une fonction mexFunction. Comme il était intéressant, j’ai piraté ensemble du code pour ce faire:

 //Include the windows api functions #include  //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 = mxArrayToSsortingng(prhs[0]); //get it as a char* ssortingng //get all open windows and call the SetTitleEnum function on them EnumWindows((WNDENUMPROC)SetTitleEnum, (LPARAM) title); mxFree(title);//free the title ssortingng. } } 

J’ai compilé le code ci-dessus dans Matlab à l’aide de Visual Studio 2010 Express et cela a bien fonctionné pour moi, à la fois dans la version en ligne de commande restreinte et dans le Matlab de bureau complet normal.