Как остановить выполнение программы matlab

Я пишу программу, в которой в какой-то момент строится график и отображается на экране. Затем пользователю нужно нажать «y» или «n», чтобы принять или отклонить график. В моем текущем решении используется PsychToolbox (фактическое решение в этом не нуждается), который включает команду под названием «KbCheck», которая во время вызова проверяет состояние всех кнопок клавиатуры. Мой код выглядит так:

function [keyPressed] = waitForYesNoKeypress keyPressed = 0; % set this to zero until we receive a sensible keypress while keyPressed == 0 % hang the system until a response is given [ keyIsDown, seconds, keyCode ] = KbCheck; % check for keypress if find(keyCode) == 89 | find(keyCode) == 78 % 89 = ‘y’, 78 = ‘n’ keyPressed = find(keyCode); end end

Проблема в том, что система действительно «зависает» до тех пор, пока не будет нажата клавиша. В идеале я мог бы прокручивать, масштабировать и в целом взаимодействовать с графиками, отображаемыми на экране, чтобы я действительно мог решить, хочу ли я нажимать «y» или «n»! Я попытался добавить «drawnow»; в приведенный выше цикл while, но это не работает: я по-прежнему не могу взаимодействовать с построенными графиками, пока после не приму или не отклоню их. Решение не обязательно должно использовать PsychToolbox; Я полагаю, есть много других вариантов там? Спасибо

How to get workspace back in MATLAB.

person CaptainProg schedule 16.02.2012 source источник

команда клавиатура может использоваться для остановки выполнения. — person Lucas то есть с «клавиатурой», чтобы принять графики, мне нужно ввести имя переменной = «y»; вернуть; — person CaptainProg nbsp schedule 16.02.2012

Ответы (6)

Я бы использовал функцию input :

a = input(‘Accept this graph (y/n)? ‘,’s’) if strcmpi(a,’y’) . else . end

Источник: digitrain.ru

Как я могу прервать выполнение программы в MATLAB?

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

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

Читайте также:
Прикладная физическая подготовка рабочая программа

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

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

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

user460472 21 фев ’14 в 04:12 2014-02-21 04:12
2014-02-21 04:12

3 ответа

Использовать terminateExecution Надежно, я считаю, что необходимо назвать короткий pause сразу после того, как Java даст время для отправки клавиши, нажмите клавишу MATLAB для ее обработки. Все вложено try — catch Заявления будут нарушены, так как я думаю, что вам нужно.

killTest.m

Restore Editor Window Back to Default in MATLAB


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 заявление в 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 и вы вернетесь в командную строку базовой рабочей области. Симпатичный способ обеспечить кликабельный триггер для выполнения dbquit был предоставлен на MATLAB Central для чтения новостей. Моя версия этого решения:

Читайте также:
Структура программы на js

fprintf(‘Terminate execution?nYes / Non’); keyboard

Когда этот фрагмент кода запускается, вы получаете небольшую подсказку, подобную этой:

Terminate execution? Yes / No

Текст «Да» и «Нет» будет кликабельным и будет выполнен dbquit или же dbcont ,

Источник: stackru.com

Как остановить работу script в Matlab

Кажется, бежит вечно. Becasue Я нажимаю F5 в окне редактора. Поэтому я не могу нажать C-Break, чтобы остановиться в консоли Matlab.

Я просто хочу знать, как остановить script. Я использую Task Manager, чтобы убить Matlab, что действительно глупо.

ОТВЕТЫ

Ответ 1

Помощник Matlab говорит, Для M файлов, которые работают долгое время, или для встроенных встроенных модулей или MEX файлов, которые работают долгое время, Ctrl + C не всегда эффективно останавливает выполнение. Как правило, это происходит на платформах Microsoft Windows, а не на платформах UNIX [1]. Если у вас возникла эта проблема, вы можете помочь выполнить разблокировку MATLAB, включив функцию слияния, паузы или getframe в ваш M файл, например, в большом цикле. Обратите внимание, что Ctrl + C может быть менее отзывчивым, если вы запустили MATLAB с параметром -nodesktop.

Поэтому я не думаю, что существует какой-либо вариант. Это происходит со многими сложными функциями Matlab. Либо мы должны ждать, либо не использовать их!

Ответ 2

Если ctrl + c не отвечает сразу, потому что ваш script слишком длинный/сложный, удерживайте его.

Команда break не запускается, когда matlab выполняет некоторые из своих более глубоких скриптов, и либо он не будет регистрировать последовательность ctrl в буфере, либо очищает буфер непосредственно перед или сразу после того, как он завершит эти фрагменты кода, В любом случае, когда matlab вернется, чтобы выполнить больше вашего script, он распознает, что вы держите ctrl + c и завершаете.

Для более длинных программ я обычно стараюсь найти хорошее место для предоставления обновления статуса, и я всегда сопровождаю это с некоторым промежутком времени, используя tic и toc. В зависимости от того, что я делаю, я мог бы использовать время выполнения, время сегмента, некоторое среднее значение и т.д.

но похоже, что у них есть и некоторые новые функции.

Читайте также:
Программа для настройки фокуса

Ответ 3

MATLAB не отвечает на Ctrl-C при выполнении функции mex, такой как svd. Также, когда MATLAB выделяет большой кусок памяти, он не отвечает. Хорошая практика заключается в том, чтобы всегда запускать ваши функции для небольшого объема данных, и когда все тестовые прогоны запускают его для фактического масштаба. Когда время является проблемой, вам нужно проанализировать, сколько времени проходит каждый сегмент кода, а также сложная сложность времени.

Ответ 4

Рассмотрим несколько сеансов Matlab. Храните главное окно сеанса (красивое со всеми цветами, файловый менеджер, история команд, рабочее пространство, редактор и т.д.) Для запуска файлов, которые, как вы знаете, завершатся.

Вещь, с которой вы экспериментируете, скажите, что вы возитесь с пакетом ode, и вы получаете множество предупреждений: матрица единственная, потому что вы изменили какой-то параметр и не предсказали, что произойдет, запустите в отдельном сеансе:

dos(‘matlab -automation -r try while ~mexIsDone(FV); java.lang.Thread.sleep(100); %pause has a memory leak drawnow; %allow stdout/err from mex to display in command window end catch mexCancel(FV); end

Ответ 6

Поскольку вы упомянули диспетчер задач, я угадаю, что вы используете Windows. Предполагая, что вы запускаете свой script в редакторе, если вы не против выхода из редактора одновременно с выходом из запущенной программы, сочетание клавиш для завершения процесса:

(Под этим я имею в виду одновременное нажатие клавиш «Alt» и «F4» на клавиатуре.)

В качестве альтернативы, как упоминалось в других ответах,

также должен работать, но не выйдет из редактора.

Ответ 7

если вы используете ваш matlab для linux, вы можете завершить работу matlab командой linux consule. сначала вы должны найти PID-номер matlab с помощью этого кода:

то вы можете использовать этот код, чтобы убить Matlab: убить

Пример: убить 58056

Ответ 8

вы можете вставить проверку времени в цикле с интенсивным или возможным тупиком, т.е.

: section_toc_conditionalBreakOff; :

где в этом разделе

if (toc > timeRequiredToBreakOff) % time conditional break off return; % other options may be: % 1. display intermediate values with pause; % 2. exit; % in some cases, extreme : kill/ quit matlab end

Источник: ask-dev.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru