Я пытаюсь реализовать шаблон проектирования Observer с помощью wxPython. У меня есть приложение моделирования, которое вычисляет огромное количество данных в фоновом режиме. Иногда я хотел бы отображать вывод модели в графическом интерфейсе --- это всего лишь сетка квадратов разных цветов. В других случаях мне нужно делать вычисления без отображения графического интерфейса.Шаблон наблюдателя в wxPython
Преимущество шаблона наблюдателя в том, что вы можете подключить или нет графического интерфейса просто путем добавления или удаления одной строки кода, что-то вроде
self.observers.append(MyWxGui())
или подобное. Теперь для этого мне нужно, чтобы мои вычисления выполнялись в одном потоке, а wx GUI - в другом. Я пытался делать это с WxPython, но я всегда получаю фатальную ошибку I/O:
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-интерфейс GUI работать в своем потоке, который не является основным приложением?
Запуск wxPython 2.8.11.0 на Ubuntu 10.10 maverick.
Знаете ли вы (не-threaded) реализацию шаблона наблюдателя в (wx) python? Pubsub, как упоминалось ниже, является глобальным издателем-подписчиком, и я еще не нашел шаблон наблюдателя. – virtualnobi 2013-03-27 11:25:32