2013-05-18 2 views
4

При использовании MATLAB через графический интерфейс я могу прервать вычисление, нажав . Ctrl - C.Interrupt MATLAB программно в Windows

Есть ли способ сделать то же самое программно при использовании MATLAB через the MATLAB Engine C API?

В системах Unix есть решение: send a SIGINT signal. Это не убьет MATLAB. Это будет только прерывать вычисление. Я ищу решение, которое работает в Windows.


Разъяснение (видя, что только отвечающий непонятый):

Я ищу способ, чтобы прервать любые вычисления MATLAB, не имея контроль над кодом MATLAB, которая запускается. Я ищу программный эквивалент нажатия Ctrl - C в окне команд MATLAB в системах Windows. Это для a Mathematica-MATLAB interface: мне нужно переслать прерывания из Mathematica в MATLAB. Как уже упоминалось выше, у меня уже есть работающая реализация Unix; этот вопрос касается того, как это сделать в Windows.

+0

[Креста сообщение на MATLAB Answers] (http://www.mathworks.com/matlabcentral/answers/76405-programmatically-interrupt-matlab-on-windows) – Szabolcs

ответ

0

Существует нет прямого способа: все эти процедуры должны быть размотаны, а их рабочие пространства очищены, что может вызвать обратные обработчики и т. Д.

Ближайший я могу думать о том, чтобы ваша основная процедура попробовать/поймать , а затем, когда вы хотите прервать, ошибка() конкретная строка, которую улов ключом, а когда вы его обнаружить, вычистите чисто из вашей основной рутины .

+0

Боюсь, вы м isunderstood. Я не контролирую код, который запускается в MATLAB. Чтобы упростить, представьте, что вы пишете свой собственный графический интерфейс для MATLAB, и вы используете API Engine. С помощью официального графического интерфейса вы можете остановить вычисления с помощью Control-C. Любой полезный GUI должен иметь это, поэтому вы хотите сделать это возможным для себя. Как?(Моя ситуация другая, но аналогичная.) – Szabolcs

1

Одним из способов было бы сделать сеанс MATLAB Engine видимым до выполнения длинных вычислений. Таким образом, если вы хотите прервать выполнение, просто приведите видимое командное окно в фокус и нажмите Ctrl-C.

Это может быть сделано с помощью функции engSetVisible

Вот краткий пример, который я попытался с помощью MATLAB COM Automation. Процесс должен быть аналогичным, поскольку MATLAB Engine реализован с использованием COM на Windows (вместо этого используются трубы в Unix).

создания сценариев осуществляется в Powershell:

# create MATLAB automation server 
$m = New-Object -ComObject matlab.application 
$m | Get-Member 

# make the command window visible 
$m.Visible = $true 

# execute some long computation: pause(10) 
$m.Feval('disp', 0,[ref]$null, 'Press Ctrl-C to interrupt...') 
$m.Feval('pause', 0,[ref]$null, 10) 

# close and cleanup 
$m.Quit() 
$m = $null 
Remove-Variable m 

Во время паузы, вы можете разбить его, нажав Ctrl + с в окне командной строки:

cmd-window

+0

Интересно! Я думал, что попробовал это, и это не сработало. Позвольте мне попробовать еще раз. – Szabolcs

+1

Оказывается, если вы используете 'Feval', то вывод идет в окна команд, а Ctrl-C работает. Если вы используете 'Execute', Ctrl-C в командном окне не работает. – Szabolcs

+0

@Szabolcs: странно. Правда по какой-то причине метод Execute не раскрывается при использовании Powershell ... Я на этот раз попытался Python, и он ведет себя так, как вы описываете, Ctrl-C работает только с 'Feval': http://pastebin.com/kQSW6E5v – Amro