2

ディレクトリを選択し、ボタンをクリックしてこのディレクトリで外部 MATLAB スクリプトを開始する小さな MATLAB-GUI を作成しました。スクリプトへのパスは変数に保存されfilerun(file). しかし、別のボタンをクリックしてこのスクリプトを停止したいと思います。これを行う方法を知っている人はいますか?

4

1 に答える 1

1

呼び出しているスクリプトに変更を加えたくない場合は、新しい Matlab インスタンスでスクリプトを実行してから、スクリプトの実行を停止するときにその matlab プロセスを強制終了することができます。何かのようなもの:

oldPids = GetNewMatlabPIDs({}); % get a list of all the matlab.exe that are running before you start the new one
% start a new matlab to run the selected script
system('"C:\Program Files\MATLAB\R2012a\bin\matlab.exe" -nodisplay -nosplash -nodesktop -minimize -r "run(''PATH AND NAME OF SCRIPT'');exit;"');
pause(0.1); % give the matlab process time to start
newPids = GetNewMatlabPIDs(oldPids); % get the PID for the new Matlab that started
if length(newPids)==1
    disp(['new pid is: ' newPids{1}])    
elseif length(newPids)==0    
    error('No new matlab started, or it finished really quickly.');
else 
    error('More than one new matlab started.  Killing will be ambigious.');
end

pause(1);
% should check here that this pid is still running and is still 
% a matlab.exe process.
system(['Taskkill /PID ' newPids{1} ' /F']);

GetNewMatlabPIDsシステム コマンドから Matlab.exe の PID を取得する場所tasklist:

function newPids = GetNewMatlabPIDs(oldPids)
tasklist = lower(evalc('system(''tasklist'')'));
matlabIndices = strfind(tasklist, 'matlab.exe');
newPids = {};
for matlabIndex = matlabIndices
    rightIndex = strfind(tasklist(matlabIndex:matlabIndex+100), 'console');
    subString = tasklist(matlabIndex:matlabIndex+rightIndex);
    pid = subString(subString>=48 & subString<=57);
    pidCellFind = strfind(oldPids, pid);
    pidCellIndex = find(not(cellfun('isempty', pidCellFind)));
    if isempty(pidCellIndex)
       newPids{end+1} = pid; 
    end
end
于 2016-09-15T16:01:27.837 に答える