Python / wxPython: постоянная работа в фоновом режиме - PullRequest
12 голосов
/ 08 апреля 2009

Я делаю программу для запуска симуляций на Python с интерфейсом wxPython. В программе вы можете создать симуляцию, и программа отображает (= рассчитывает) ее для вас. Иногда рендеринг может занимать много времени.

Когда пользователь запускает симуляцию и определяет начальное состояние, я хочу, чтобы программа непрерывно отображала симуляцию в фоновом режиме, в то время как пользователь может делать разные вещи в программе. Вроде как панель в стиле YouTube, которая заполняется: вы можете воспроизводить симуляцию только до той точки, которая была отрисована.

Как запустить функцию рендеринга?

Ответы [ 4 ]

7 голосов
/ 16 апреля 2009

В вики wxPython содержится достаточно информации о долгосрочных задачах , которые могут быть полезны В основном они используют поток и wx.PostEvent для обработки связи между потоком и основным циклом событий wx.

7 голосов
/ 14 апреля 2009

Я бы использовал threading.Thread для запуска кода в фоновом режиме и wx.CallAfter для публикации обновлений в моей ветке окна, чтобы отобразить их пользователю.

thread = threading.Thread(target=self.do_work)
thread.setDaemon(True)
thread.start()

...

def do_work(self):
    # processing code here
    while processing:
        # do stuff
        wx.CallAfter(self.update_view, args, kwargs)

def update_view(self, args):
    # do stuff with args
    # since wx.CallAfter was used, it's safe to do GUI stuff here
4 голосов
/ 08 апреля 2009

Запустите новый процесс для рендеринга в фоновом режиме и периодически проверяйте, вернулся ли он.

Вы можете найти документацию для модуля подпроцесса здесь и многопроцессорного модуля здесь . Как сказал Джей, многопроцессорность, вероятно, лучше, если вы используете Python 2.6. Тем не менее, я не думаю, что между ними будет какая-то разница в производительности. Многопроцессность, похоже, является оболочкой для подпроцесса, облегчающей выполнение определенных задач.

В то время как подпроцесс / многопроцессор является стандартным способом сделать это, вы также можете взглянуть на Parallel Python .

0 голосов
/ 14 апреля 2009

Если вы не возражаете против использования совсем немного другого подхода, вы можете взглянуть на python stackless и создать тасклет для вашего процесса рендеринга. Я считаю, что очень легко использовать лично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...