Я пытаюсь реализовать шаблон проектирования 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.