Я пишу программу, в которой в какой-то момент строится график и отображается на экране. Затем пользователю нужно нажать «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 для чтения новостей. Моя версия этого решения:
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