У меня есть приложение 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, но это заставит вещи ползти. Есть идеи?