Я пытаюсь реализовать шаблон проектирования Observer с помощью wxPython. У меня есть приложение для моделирования, которое вычисляет огромное количество данных в фоновом режиме. Иногда я хотел бы отобразить вывод модели в графическом интерфейсе, который представляет собой просто сетку квадратов разных цветов. В других случаях мне нужно выполнить вычисления без отображения графического интерфейса.
Преимущество шаблона наблюдателя заключается в том, что вы можете подключить или не подключить графический интерфейс, просто добавив или удалив одну строку кода, что-то вроде
self.observers.append(MyWxGui())
или похожие. Теперь, чтобы сделать это, мне нужно, чтобы мои вычисления выполнялись в одном потоке, а графический интерфейс wx — в другом. Я пытался сделать это с помощью wxPython, но всегда получаю фатальную ошибку ввода-вывода:
python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.
Я читал руководства по многопоточности в wxPython, такие как http://wiki.wxpython.org/LongRunningTasks, но у всех у них есть Mainloop(), работающий в основном потоке, а затем длительная задача во вторичном потоке, в то время как мне нужно, чтобы это было наоборот. Это связано с тем, что если у меня есть Mainloop() в основном потоке, программа зависает в ожидании какого-либо события из графического интерфейса вместо того, чтобы продолжить вычисление.
Я также увидел, что не могу манипулировать контекстами устройств (DC), такими как ClientDC или PaintDC, в подпотоке, но я запускаю весь код wx внутри одного и того же потока.
Можно ли запустить Mainloop() и весь графический интерфейс wx в своем собственном потоке, который не является потоком основного приложения?
Запуск wxPython 2.8.11.0 на Ubuntu 10.10 Maverick.