代码之家  ›  专栏  ›  技术社区  ›  namenlos

在WinForms应用程序中嵌入Ironpython并中断执行

  •  10
  • namenlos  · 技术社区  · 15 年前

    背景

    我的问题

    • 用户需要中断代码的执行。
    • 换言之,当从命令行运行python或ironpython时,它们需要类似于按下ctrl-c来停止执行的能力。
    • 我想在WinForm中添加一个按钮,当按下该按钮时将停止执行,但我不确定如何执行。

    我的问题

    • 我如何才能做到按“停止”按钮实际上会停止使用输入的Ironpython代码的执行?

    笔记

    • 注意:我不希望简单地丢弃“会话”——我仍然希望用户能够与会话交互,并访问在会话停止之前可用的任何结果。
    • 我假设我需要在一个单独的线程中执行此操作,任何正确执行此操作的指导或示例代码都将不胜感激。
    1 回复  |  直到 15 年前
        1
  •  10
  •   Jeff Hardy    15 年前

    这基本上是对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 .

    推荐文章