2009-11-10 3 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.runcode가 동시에 다른 스레드에서 일어나고있는 기회가 발생

. 그것은 내가 component.begininvoke 없애 버려야 할 것 같아하지만 물건을 크롤 링하게 만들 것입니다. 어떤 아이디어?

+0

1 년 전에이 글을 올렸지 만 비슷한 종류의 문제에 대한 해결책을 찾고 있습니다. 당신이 그 일을 끝내려고 했니? 문제를 일으키는 엔진에 동시 액세스하는 것이 아니라, 각 스레드에 대해 별도의 ScriptScope를 작성해야한다고 생각했습니다. 나는 당신이 당신의 문제를 어떻게 해결했는지 알고 싶어합니다. – Dave

답변

0

각 실행마다 EngineModule을 만들고 그 코드를 실행하고 싶을 것입니다. 그런 다음 모든 코드가 다른 변수 집합에 대해 실행됩니다. 또한 매번 compiledCode 객체를 가져 와서 engine.Execute가 매번 다시 컴파일해야하기 때문에 매번 새로운 EngineModule에 대해 실제로 실행하려고합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 얼마 전에 이것을 시도해 보았습니다 - 새로운 pythonengine 객체를 생성했습니다. 그러나 동시에 다른 스레드에서 이러한 일이 발생하면 충돌이 발생합니다. 철 python 문제라고 생각합니다. 그게 내가 싱글 톤을 사용하기 시작한 이유라고 생각합니다. 컴파일 된 코드 제안에 감사드립니다. – Sharun

관련 문제