10

バックグラウンド

私の問題

  • ユーザーはコードの実行を中断する必要があります
  • つまり、コマンドラインからPythonまたはIronPythonを実行するときに、CTRL-Cを押して実行を停止する機能などが必要です。
  • WinFormにボタンを追加して、押すと実行が停止するようにしたいのですが、これを行う方法がわかりません。

私の質問

  • 「停止」ボタンを押すと、入力したIronPythonコードを使用して実行が実際に停止するようにするにはどうすればよいですか?

ノート

  • 注:その「セッション」を単純に破棄したくはありません。ユーザーがセッションを操作して、セッションが停止する前に利用可能だった結果にアクセスできるようにしたいのです。
  • これを別のスレッドで実行する必要があると想定しています。これを正しく実行するためのガイダンスまたはサンプルコードをいただければ幸いです。
4

1 に答える 1

10

これは基本的に、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ます。

于 2010-05-27T19:37:57.893 に答える