21

コードでコマンドを呼び出して、現在実行中のスクリプト (関数) を終了できるようにしたいと考えています。Return は、スクリプト全体ではなく、現在の関数のみを終了します。したがって、リターンは1つではありません。

私が探しているのは、まさにCTRL+Cが行うことを行うコマンドです。私はすでにこれを見てきました:実行を停止する方法、そして誰もまだこの質問に対する適切な答えをそこに提供していないことに気付きました.

最終的に、図を閉じるときに実行中のスクリプト全体を終了したい:

hFig = figure('CloseRequestFcn',{@closeHandler});

.
.
.
function closeHandler (src,evnt)

    CTRL+C    <--- I am looking for such a command     
end

PS。function error() も機能しません:これを試してください:

function terminateInCode()

hFig = figure('CloseRequestFcn',{@closeHandler});

while(1)

   plot(10*rand,10*rand,'+');
   pause(0.1);
end;

   function closeHandler (src,evnt)
      delete(hFig);
      error('program terminated!');
   end
end
4

7 に答える 7

12

yuk's answerに基づいた例を含むサンプル関数を次に示します。コンポーネントは次のとおりです。

  • コマンド ウィンドウにCTRL+を受け取るためのフォーカスがあることを確認します。C
  • タイマーを使用して、ブレークが発生した後にCTRL+を解放しますC
  • Java ロボットを使用してCTRL+を押しますC

サンプル関数は次のとおりです。

function terminateExecution
%terminateExecution  Emulates CTRL-C
%    terminateExecution   Stops operation of a program by emulating a
%    CTRL-C press by the user.
%
%    Running this function
%
%Example:
%for ix = 1:100
%    disp(ix)
%    if ix>20
%        terminateExecution;
%    end
%end

%1) request focus be transferred to the command window
%   (H/T http://undocumentedmatlab.com/blog/changing-matlab-command-window-colors/)
cmdWindow = com.mathworks.mde.cmdwin.CmdWin.getInstance();
cmdWindow.grabFocus();

%2) Wait for focus transfer to complete (up to 2 seconds)
focustransferTimer = tic;
while ~cmdWindow.isFocusOwner
    pause(0.1);  %Pause some small interval
    if (toc(focustransferTimer) > 2)
        error('Error transferring focus for CTRL+C press.')
    end
end

%3) Use Java robot to execute a CTRL+C in the (now focused) command window.

%3.1)  Setup a timer to relase CTRL + C in 1 second
%  Try to reuse an existing timer if possible (this would be a holdover
%  from a previous execution)
t_all = timerfindall;
releaseTimer = [];
ix_timer = 1;
while isempty(releaseTimer) && (ix_timer<= length(t_all))
    if isequal(t_all(ix_timer).TimerFcn, @releaseCtrl_C)
        releaseTimer = t_all(ix_timer);
    end
    ix_timer = ix_timer+1;
end
if isempty(releaseTimer)
    releaseTimer = timer;
    releaseTimer.TimerFcn = @releaseCtrl_C;
end
releaseTimer.StartDelay = 1;
start(releaseTimer);

%3.2)  Press press CTRL+C
pressCtrl_C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function pressCtrl_C
    import java.awt.Robot;
    import java.awt.event.*;
    SimKey=Robot;
    SimKey.keyPress(KeyEvent.VK_CONTROL);
    SimKey.keyPress(KeyEvent.VK_C);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function releaseCtrl_C(ignore1, ignore2)
    import java.awt.Robot;
    import java.awt.event.*;
    SimKey=Robot;
    SimKey.keyRelease(KeyEvent.VK_CONTROL);
    SimKey.keyRelease(KeyEvent.VK_C);
于 2012-04-10T22:19:47.110 に答える
7

それが機能するかどうかはわかりませんが、単なるアイデアです。MATLAB からキーボードのキー押下をエミュレートしてみませんか?

次のいずれかを試すことができますjava.awd.Robot

import java.awt.Robot;
import java.awt.event.*;
SimKey=Robot;
SimKey.keyPress(KeyEvent.VK_CONTROL);
SimKey.keyPress(KeyEvent.VK_C);

またはWScript.Shell および SendKeys

于 2012-04-05T22:57:06.647 に答える
6

残念ながら、それはできないようです:

マスワークス

キーボードの+の組み合わせを使用する以外に、MATLAB でCtrl+Cをプログラムで発行する方法はありません。CtrlC

別の方法として、ERROR コマンドを使用して強制的にエラーを発生させ、コードを終了させることもできます。例えば:

error('Program terminated for a specific reason')
于 2012-04-05T21:26:03.837 に答える
3

文書化されていない Matlab 呼び出しを使用して、キー イベントをコマンド ウィンドウに直接配置する代替方法を次に示します。その方法は保護されています。これはリフレクションを使用して保護を解除します。

@yuk および @Persuit の回答とは異なり、これにはコントロール キーの固着に関する問題はないようです。さらに、競合状態やフォーカスを確保するその他の問題なしに、常にコマンド ウィンドウに直接投稿されます。そして、決定論的に起動すると思います-すぐに実行されます。

1 つの注意点は、ドキュメント化されていない呼び出しを使用して、コマンド ウィンドウ インスタンスのハンドルを取得することです。これは、ウィンドウ フレームのレイアウトに依存するため、リリースによって若干異なります。ファイル交換に関する Yair Altman (undocumentedmatlab.com) の作業の一部には、より一般的な方法でこれを取得するためのより堅牢な機能があります。このコードは、Matlab の最新リリースのほとんどで動作するはずです (R2011a でテスト済み、Mac と Win の両方)。

function interrupt

import java.awt.event.KeyEvent
import java.util.Calendar
import java.lang.reflection.*

cmdwin = handle(com.mathworks.mde.cmdwin.CmdWin.getInstance().getComponent(0).getComponent(0).getComponent(0),'CallbackProperties');

argSig = javaArray('java.lang.Class',1);
argSig(1) = java.lang.Class.forName('java.awt.event.KeyEvent');
method = cmdwin.getClass().getDeclaredMethod('processKeyEvent',argSig);
method.setAccessible(true);

cal = Calendar.getInstance();
args = javaArray('java.lang.Object',1);
args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,cal.getTime().getTime(),KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED);
method.invoke(cmdwin,args);
于 2012-04-17T20:46:56.040 に答える
2

関数を使用できますerror。matlabに戻ります。

CTRL+Cエラーが発生しますが、matlabスクリプトでを押すと通常発生します。

次のようなメッセージを追加する必要がありますerror('Interrupted by user');

于 2012-04-05T18:06:51.490 に答える
1

それはまさにあなたが求めているものではありませんが、あなたの例を考えると、あなたの問題は次のように解決できます:

function terminateInCode()

hFig = figure('CloseRequestFcn',{@closeHandler});

stop=0;
while(~stop)
   plot(10*rand,10*rand,'+');
   pause(0.1);
end;

   function closeHandler (src,evnt)
      delete(hFig);
      stop=1;
   end
end
于 2012-04-10T20:07:36.230 に答える
-2

return ステートメントを試してください。それはあなたを機能から追い出します。

完全に終了させたい場合は、ERROR を使用する必要があります。

本当に悲惨な場合は、いつでも EXIT を使用できます。

于 2012-04-17T16:02:26.737 に答える