C # Запуск IronPython в нескольких потоках - PullRequest
1 голос
/ 10 ноября 2009

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

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

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

1 Ответ

0 голосов
/ 11 ноября 2009

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

...