2009-11-10 126 views
1

我有一个控制音频硬件的WPF应用程序。它在多个线程上使用相同的PythonEngine。这导致奇怪的错误,我不时看到PythonEngines Globals字典缺少值的地方。我正在寻找一些关于如何调试/修复这个问题的指导。C#在多线程上运行IronPython

该设备有多个组件[过滤器,增益等]。每个组件都有多个控件[滑块,切换按钮等]。

每次用户更改控制值时,都需要运行python脚本(来自硬件供应商)。我正在使用IronPython 1.1.2(PythonEngine.Execute(code))来执行此操作。

每个组件都有一个脚本。每个脚本都需要运行所有控件(该组件)的当前值。

序列为 - 用户更改>运行组件脚本>将结果发送到设备>检查响应是否失败。整个循环花费很长时间来保持UI等待,所以每次改变时我都会做一些类似component.begininvoke(startcycle)的事情。

Startcycle看起来是这样的 -

PyEngine Engine = PyEngine.GetInstance(); // this is a singleton 
lock(component) // this prevents diff controls of the same component from walking over each other 
{ 
    Engine.runcode(...) 
} 

不同 component.begininvokes发生接近对方有哪里engine.runco​​de是在不同的线程在同一时间发生的机会。它看起来像我需要摆脱component.begininvoke,但这会让事情抓取。有任何想法吗?

+0

您在一年前发布了此消息,但我正在研究类似问题的解决方案。你最终得到它的工作?我在想,这不是同时访问引起问题的引擎,但可能需要为每个线程创建一个单独的ScriptScope。我很想知道你是如何解决你的问题的。 – Dave 2010-11-10 14:50:01

回答

0

您可能想要为每个执行创建一个EngineModule并针对该代码执行代码。然后所有的代码将运行在一组不同的变量上。您也可能想要获取CompiledCode对象,并且每次都针对新的EngineModule实际执行该对象,因为engine.Execute每次都需要重新编译它。

+0

感谢您的回复。我前一阵子尝试过 - 创建新的pythonengine对象。但是当这种情况发生在不同的线程上时,它会崩溃。我认为这是一个讽刺问题。我认为这是我开始使用单身人士的原因。感谢编译代码建议。 – Sharun 2009-11-11 08:24:51