Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab: implementing what CTRL+C does, but in the code

Tags:

matlab

I would like to be able to terminate my current running scripts( functions ) by calling a command in the code. Return would only terminate the current function not entire script. Therefore return is not the one.

What I am looking for is a command which does exactly what CTRL + C do. I have already seen this: how to stop execution and noticed that no one has yet provided a proper answer for this question in there either.

ultimately I want to terminate the entire running scripts upon closing a figure:

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

.
.
.
function closeHandler (src,evnt)

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

PS. function error() will not work either: Try this:

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
like image 870
C graphics Avatar asked Apr 05 '12 17:04

C graphics


People also ask

What does Ctrl C do in MATLAB?

NOTE: The following are known Ctrl+C behaviors in specific versions of MATLAB for Windows. In general, when you use Ctrl+C, MATLAB should break execution at the next call to DRAWNOW, PAUSE, GETFRAME, or with a return to the command prompt.

How do you terminate a program in MATLAB?

To stop execution of a MATLAB® command, press Ctrl+C or Ctrl+Break. On Apple Macintosh platforms, you also can use Command+. (the Command key and the period key). Ctrl+C does not always stop execution for files that run a long time, or that call built-ins or MEX-files that run a long time.

What is the difference between Command Window and script in MATLAB?

You cannot use mfilename in the command window . You cannot pause execution in the command window . In r2016b and later you can define scripts in script files . With newer matlab releases you can use the editor interface to pause a script .

How do you write and run code in MATLAB?

On the Editor or Live Editor tab, in the Section section, click Run Section. In the Live Editor, you also can click the blue bar to the left of the section. Run the code in the selected section, and then move to the next section. On the Editor or Live Editor tab, in the Section section, select Run and Advance.


4 Answers

Here is a sample function with example based on yuk's answer. Components include:

  • Insure the command window has focus to receive the CTRL+C
  • Use a timer to release CTRL+C after the break has occurred
  • Use a Java robot to press CTRL+C

Sample function is below:

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);
like image 169
Pursuit Avatar answered Oct 01 '22 21:10

Pursuit


Not sure it will work, just an idea. How about to emulate keyboard key press from MATLAB?

You can try either java.awd.Robot:

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

or WScript.Shell and SendKeys.

like image 29
yuk Avatar answered Oct 01 '22 20:10

yuk


Unfortunately, it seems it cannot be done:

Mathworks

There is no way to programmatically issue a Ctrl+C in MATLAB besides using the keyboard's Ctrl+C combination.

As an alternative, you can use the ERROR command to force an error that will exit the code. For example:

error('Program terminated for a specific reason')
like image 38
Smash Avatar answered Oct 01 '22 22:10

Smash


Here's an alternative that uses undocumented Matlab calls to place the key event directly into the command window. The method to do so is protected; this uses reflection to unprotect it.

Unlike @yuk and @Persuit's answers, this does not seem to have issues with the control key sticking. Additionally, it will always post directly to the command window without any race conditions or other issues of ensuring focus. And, I think that it fires deterministically -- it'll execute immediately.

The one caveat is that it uses an undocumented call to retreive the handle of the command window instance. This varies slightly by release as it is dependent upon the window frame layout. Some of Yair Altman's (undocumentedmatlab.com) work on the file exchange has more robust functions to grab this in a more general fashion; this code should work with most modern releases of Matlab (Tested on R2011a, both 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);
like image 3
mbauman Avatar answered Oct 01 '22 22:10

mbauman