4

これが簡単な問題であることを願っていますが、まだ答えを見つけていませんし、これに関する適切なリソースも見ていません。私は Matlab で実験を行っていますが、時々外部プログラムを呼び出します。一定の時間が経過したら、参加者に Matlab に戻ってアンケートに回答してもらい、完了後にタスクを再開してもらいます。問題は、外部コードが対話型であるため、ユーザーが入力したりクリックしたりしても調査が開いていない可能性があり、調査を完了した後、開いているプログラムに自動的に戻る方法がわからないことです (ただし、調査が完了し、ブラウザが自動的に閉じます)。私のおもちゃのコードの例は次のとおりです。

    system('start \max notepad.exe')
    pause(60) %After x seconds a web page opens up in Matlab, how to ensure users see it?
    web('cnn.com') %I have code that will close this after they click on a certain link

    %After close browser, how to return to notepad where they left off?
4

1 に答える 1

3

2 つの解決策が役立つ場合があります。実際には、少し複雑です。解決策 1 c コードによるプログラムの mex メソッド コントロール ウィンドウを使用します。解決策 2 も複雑です。MATLAB 並列ツールボックスを使用するだけです。うーん、解決策1を使用することをお勧めします。


解決策 1:

  1. 対話型プログラム (つまり、ここではウィンドウ エクスプローラー) を制御する cpp ファイルを作成します。コードは以下です。コードをコピーして、MATLAB の現在のフォルダーに "ctrlWindow.cpp" として保存します。

  2. コンパイラ lcc で ctrlWindow.cpp をコンパイルします。

    mex -setup % choose compiler: type this command at MATLAB command, then choose lcc complier on windows 32 system
    
    mex ctrlWindow.cpp % compile cpp: you would find ctrlWindow.mexw32 at current folder
    
  3. MATLAB コマンドで m-file として mex ファイルを実行します。

    ctrlWindow('your_program_window_name',command);

つまり、フォルダ「myfold」のウィンドウ名は、ウィンドウの左上に表示される myfold です。次のコマンドを入力します。

ctrlWindow('myfold',6); 

これにより、フォルダ ウィンドウが最小化されます。最初にプログラム ウィンドウを最小化してから最大化すると、参加者は再びプログラムに集中できるようになります。

ctrlWindow('myfold',6);%minimize window
ctrlWindow('myfold',3);%maximize window and participants would focus on this window

コマンドはここにあります:

HIDE             0
SHOWNORMAL       1
NORMAL           1
SHOWMINIMIZED    2
SHOWMAXIMIZED    3
MAXIMIZE         3
SHOWNOACTIVATE   4
SHOW             5
MINIMIZE         6
SHOWMINNOACTIVE  7
SHOWNA           8
RESTORE          9
SHOWDEFAULT      10
FORCEMINIMIZE    11
MAX              11

//ファイル名:ctrlWindow.cpp

#include <windows.h>

#include "mex.h"


void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[] )
{
    mxChar* winName; //name of window wanted to be found
    HWND hwnd; //handle of window
    int command; //command of control window
    // check number of input
    if(nrhs!=2)
        mexErrMsgTxt("input must be 2");
    // check class of input
    if (mxIsChar(prhs[0]))
        winName=mxGetChars(prhs[0]);//get name of window
    else
        mexErrMsgTxt("input 1 should be char -- name of window");
    if (mxIsDouble(prhs[1]))
    {
        command = (int) mxGetScalar(prhs[1]);//get command
        if(command<0 || command >11)//check command
            mexErrMsgTxt("No such command!!!");
    }
    else
        mexErrMsgTxt("input 2 should be a double");
    // find window
    hwnd = FindWindowW(NULL, (LPCWSTR)winName);
    if(NULL==hwnd)
    {
        MessageBoxW(NULL,(LPCWSTR) L"Can't find the window!!!",NULL,MB_OK);
        return;
    }
    ShowWindow(hwnd, command);//control the window
}

解決策 2:

matlabpool open 2

2 つの matlab バックグラウンドを開き、最初のプログラムを使用して最初のプログラムを制御し、2 番目のプログラムを使用して 2 番目のプログラムを制御します。

于 2012-11-19T13:52:29.033 に答える