我有一个控制音频硬件的WPF应用程序。它在多个线程上使用相同的PythonEngine。这会导致我不时看到PythonEngines Globals字典缺少值的奇怪错误。我正在寻找有关如何调试/修复此问题的一些指导。
该设备有多个组件[过滤器,增益等]。每个组件都有多个控件[slider's,togglebutton's等]。
每次用户更改控件值时,都需要运行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.runcode。看起来我需要摆脱component.begininvoke,但这会使事情爬行。有什么想法吗?
答案 0 :(得分:0)
您可能希望为每次执行创建一个EngineModule,并针对该代码执行代码。然后,所有代码都将针对不同的变量集运行。你也可能想要获得一个CompiledCode对象,并且实际上每次都对新的EngineModule执行它,因为engine.Execute每次都需要重新编译它。