2009-11-10 4 views
1

У меня есть приложение WPF, которое управляет аудио оборудованием. Он использует один и тот же PythonEngine для нескольких потоков. Это вызывает странные ошибки, которые я вижу время от времени, когда словарь PythonEngines Globals имеет отсутствующие значения. Я ищу некоторые рекомендации относительно того, как отлаживать/исправлять это.C# Запуск IronPython на несколько потоков

Устройство имеет несколько компонентов [фильтр, коэффициент усиления и т. Д.]. Каждый компонент имеет несколько элементов управления [ползунок, переключатели и т. Д.].

Каждый раз, когда пользователь меняет контрольное значение, должен запускаться скрипт python (от поставщика оборудования). Я использую IronPython 1.1.2 (PythonEngine.Execute (code)), чтобы сделать это.

У каждого компонента есть сценарий. И каждый сценарий требует, чтобы текущие значения всех элементов управления (этого компонента) запускались.

Последовательность - пользователь выполняет изменение> запустить компонентный скрипт> отправить результаты на устройство> проверить ответ на отказ. Весь этот цикл занимает слишком много времени, чтобы поддерживать пользовательский интерфейс, поэтому каждый раз что-то меняется. Я делаю что-то вроде 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 происходит на разных потоках одновременно. Похоже, мне нужно избавиться от компонента.begininvoke, но это заставит вещи сканировать. Есть идеи?

+0

вы отправили это год назад, но я исследую решения для аналогичной проблемы. Вы в конечном итоге заставить его работать? Я думал, что это не одновременный доступ к движку, который вызывает проблемы, но, возможно, вам нужно создать отдельный ScriptScope для каждого потока. Мне любопытно узнать, как вы решили решить свою проблему. – Dave

ответ

0

Возможно, вы захотите создать EngineModule для каждого выполнения и выполнить код против этого. Затем весь код будет работать против другого набора переменных. Вы также, вероятно, хотите получить объект CompiledCode и на самом деле выполнять его против нового EngineModule каждый раз, потому что engine.Execute необходимо будет повторно скомпилировать его каждый раз.

+0

Спасибо за ответ. Я попробовал это некоторое время назад - создание новых объектов pythonengine. Но когда это происходило на разных потоках, в то же время он рухнул бы. Я думаю, это была проблема с железом. Я думаю, именно поэтому я начал использовать синглтон. Спасибо за предложение compiledcode. – Sharun

Смежные вопросы