2014-02-21 5 views
4

Как остановить выполнение программы в MATLAB без выхода из MATLAB. Я ищу что-то вроде exit (1) в C++.Как я могу прервать выполнение программы в MATLAB?

Я попытался выйти/выйти, но они также убивают MATLAB, который не является поведением, которое я хочу.

В идеале я бы использовал try-catch для создания ошибок, но я исправляю существующий код и не могу этого сделать из-за глубоко вложенного стека вызовов. Благодаря!

EDIT:

Я также попытался error и return, но они в конечном итоге в функциях, ссылающегося поймать блок, который является не то, что я хочу либо. Я просто хочу остановить запущенную программу для выхода.

Кроме того, Ctrl-C требует от пользователя прекратить выполнение, и это не то, что я хочу.

+0

Это действительно хороший вопрос, но я не думаю, что есть решение, если вы не хотите использовать исключения. –

+0

Ха-ха, я искал больше, как «Это очень простой вопрос». Это странно. Возможно, мне придется полагаться на выход, но пользователь не будет знать, что попало в них, если я не вывешу файл журнала, но это еще не вариант. Благодаря! – theoutlander

+0

Я не совсем понимаю вопрос. Что вы подразумеваете под << остановкой выполнения программы в Matlab без выхода из Matlab >>. Можете ли вы привести пример, скажем, используя мнимую команду? –

ответ

0

ли вы имеете в виду

return 

?

Вы также можете использовать

error("free text argument") 

также (в качестве средства отладки)

keyboard 

(но я думаю, что это устаревшее)

+0

Как раз собирался опубликовать, что я также попытался вернуть и ошибку, но они оба попадают в блокировки блокировки функций, которые не то, что я хочу. – theoutlander

1

Вы ищете сочетание Ctrl+c ключа. Это прекратит выполнение любой программы. Возьмите курсор к командному окну MATLAB и нажмите Ctrl+c.

Хотя есть два сценария, когда даже Ctrl+c не может остановить выполнение:

  1. Иногда, если MEX-файл становится казнен. Ctrl+c не будет иметь никакого эффекта.
  2. Если ваша оперативная память настолько заполнена, что она даже не может выполнить Ctrl+c.

Тогда у вас нет другого выбора, кроме как пойти в диспетчер задач и остановить процесс MATLAB.

+0

Это работает только тогда, когда пользователь хочет его сломать. Я хочу, чтобы код прекратил выполнение. – theoutlander

+1

Этот подход может быть применен, ожидая ввода клавиатуры и попросив пользователя нажать ctrl-C для выхода из программы (иначе мы могли бы убить Matlab, вызвав exit) ... однако он по-прежнему не идеален, так как требует вмешательства пользователя. – theoutlander

+0

@NickKarnik True, вместо ошибки вы можете распечатать сообщение, а затем 'pause' дождаться CTRL-C. – chappjc

3

То, что вы хотите, это эквивалент из CTRL-C, но быть выполняется с помощью команды вместо фактического пользователя нажатия клавиши. Использование Java Robot для имитации этого нажатия клавиши было suggested by @yuk. Этот метод был хорошо использован @Pursuit в его функции под названием terminateExecution. Еще одно решение на основе Java, interrupt было предложено компанией @MattB.

Чтобы эффективно использовать terminateExecution, я нахожу, что необходимо коротко позвонить по телефону pause, чтобы дать время Java для отправки нажатия клавиши и для MATLAB для его обработки. Все вложенные try - catch заявления будут сломаны, как я думаю, вам нужно.

killTest.м

function killTest 

try 
    annoyingFunction(); 
    fprintf('Does not run.'); 
catch ME 
    fprintf('Fooled again! (%s)\n',ME.message); 
end 

end 

function annoyingFunction() 

somethingWrong = true; % more useful code here 
if somethingWrong, 
    % error('annoyingFunction:catchableError','catchable error'); 
    terminateExecution % by Pursuit 
    % interrupt % by Matt B. 
    pause(0.1) 
end 

end 

Пример

Вы вернетесь в командную строку непосредственно из подфункции, но это выглядит как программа была прекращена нажатием клавиши:

>> killTest 
Operation terminated by user during killTest>annoyingFunction (line 17) 

In killTest (line 4) 
    annoyingFunction(); 
>> 

Если вместо этого вы используете error (раскомментируйте строку ошибки внутри annoyingFunction, чтобы проверить), она попадает на catch s tatement в killTest:

>> killTest 
Fooled again! (catchable error) 

Предлагаемые изменения в interrupt (упрощений, более надежное приобретение команды оконной ручки и читаемость):

function interrupt 

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

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

argSig = javaArray('java.lang.Class',1); 
argSig(1) = java.lang.Class.forName('java.awt.event.KeyEvent'); 

msTime = (8.64e7 * (now - datenum('1970', 'yyyy'))); 
args = javaArray('java.lang.Object',1); 
args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,msTime,... 
    KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED); 

method = cmdwin.getClass().getDeclaredMethod('processKeyEvent',argSig); 
method.setAccessible(true); 
method.invoke(cmdwin,args); 

Примечание: Если все в порядке с набрав что-то, чтобы полностью выйти, просто используйте keyboard и когда он остановится в командной строке отладки (K>>), введите dbquit a d вы вернетесь в командную строку базового рабочего пространства. Симпатичный способ предоставления интерактивного триггера для выполнения dbquit был предоставлен на MATLAB Central newsreader. Моя версия этого решения:

fprintf('Terminate execution?\n<a href="matlab: dbquit;">Yes</a>/<a href="matlab: dbcont;">No</a>\n'); 
keyboard 

Когда этот бит кода запускается, вы получите немного подсказку, как это:

Terminate execution? 
Yes/No 

«да» и «Нет» Текст будет интерактивными и будет либо выполните dbquit или dbcont.

+0

Какая разница между этим и ошибкой («...»), кроме грациозности? –

+0

@Parag Он не попадает в выражения 'catch'. (См. Комментарий Ника к Vish.) В коде примера инструкции 'fprintf' не запускаются, он просто прекращает выполнение и возвращается в командную строку. Попробуйте раскомментировать заявление 'error', чтобы понять, что я имею в виду. – chappjc

+0

@Parag Вот почему ваш ответ сработал бы, если бы не та часть, где пользователь должен ударить по клавишам. :) – chappjc

Смежные вопросы