Встраивание IronPython в приложении WinForms и прерывание выполнения

ФОН

МОЯ ПРОБЛЕМА

  • Пользователи должны будут прервать выполнение своего кода
  • Другими словами, им нужно что-то как способность поразить CTRL-C для остановки выполнения когда под управлением Python или IronPython от cmdline
  • Я хочу добавить кнопку к winform, что, когда нажатые остановы выполнение, но я не уверен, как сделать это.

МОЙ ВОПРОС

  • Как я могу добраться до того нажатия, кнопка "остановки" на самом деле остановится, выполнение использования ввело код IronPython?

Примечания

  • Примечание: Я не хочу просто выбрасывать ту "сессию" - я все еще хочу, чтобы пользователь смог взаимодействовать с сессией и доступом любые результаты, которые были доступны, прежде чем это было остановлено.
  • Я предполагаю, что должен буду выполнить это в отдельном потоке, любом руководстве или примере кода в выполнении, это правильно будет цениться.
10
задан namenlos 27 May 2010 в 22:26
поделиться

1 ответ

Это в основном адаптация того, как консоль IronPython обрабатывает Ctrl-C. Если вы хотите проверить источник, он находится в BasicConsole и CommandLine.Run .

Во-первых, запустите движок IronPython в отдельном потоке (как вы и предполагали). Когда вы запускаете код пользователя, оберните его в блок try ... catch (ThreadAbortException) :

var engine = Python.CreateEngine();
bool aborted = false;
try {
    engine.Execute(/* whatever */);
} catch(ThreadAbortException tae) {
    if(tae.ExceptionState is Microsoft.Scripting.KeyboardInterruptException) {
        Thread.ResetAbort();
        aborted = true;
    } else { throw; }
}

if(aborted) {
    // this is application-specific
}

Теперь вам нужно держать ссылку на поток IronPython под рукой. Создайте обработчик кнопки в форме и вызовите Thread.Abort () .

public void StopButton_OnClick(object sender, EventArgs e) {
    pythonThread.Abort(new Microsoft.Scripting.KeyboardInterruptException(""));
}

Аргумент KeyboardInterruptException позволяет потоку Python перехватить ThreadAbortException и обработать его как KeyboardInterrupt .

10
ответ дан 4 December 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: