Графический интерфейс wxpython и многопроцессорность - как отправить данные обратно из длительного процесса - PullRequest
2 голосов
/ 18 мая 2010

Попытка запустить трудоемкую задачу из графического интерфейса wxpython. Основная идея состоит в том, чтобы запустить долгосрочное задание из графического интерфейса пользователя (нажав кнопку), а затем из него следует обновить статический текст в диалоговом окне.

Сначала я попробовал несколько потоков (http://wiki.wxpython.org/LongRunningTasks и многие другие просмотренные ресурсы), и я хочу показать сообщения с помощью Publisher.class. Все пошло не так хорошо, после одного-двух сообщений графический интерфейс, кажется, завис.

Теперь я хочу добиться этого с помощью многопроцессорной обработки. У меня есть этот метод в моем классе 'GUI':

        def do_update(self, e):
            self.txt_updatemsg.SetLabel("Don't stop this \n")
            ...

            pub = Publisher() # i tried also calling directly from dbob object
            # Publisher() is a singleton so this must be useless?
            pub.subscribe(self.__update_txt_message, ('updatedlg', 'message'))

            dbob = dbutils.DBUtils() # DBUtils is the class with 'long time' tasks
            dbob.publisher = pub

            p = Process(target=self.do_update_process, args=(dbob,))
            p.start()
            while p.is_alive:
                wx.Yield

        def do_update_process(self, dbob):
            dbob.do_update()

__ update_txt_message - простая функция, которая устанавливает статический текст в диалоге.

Вопрос: как я могу отправить несколько текстовых сообщений из этого процесса (просто текст, это все, что мне нужно) Спасибо, ребята!

Ответы [ 3 ]

3 голосов
/ 20 мая 2010

Робин Данн любезно ответил мне в списке рассылки wxpython

Модуль pubsub не может пересекать границы процесса. Тебе понадобиться использовать классы, предоставляемые модулем многопроцессорной обработки, или некоторые другие метод межпроцессного взаимодействия, для общения между родителем и дочерние процессы.

Итак, я исправил проблему с помощью модуля потоков.

1 голос
/ 28 мая 2013

Стандартный способ - использовать один или несколько объектов Queue для передачи данных туда и обратно в многопоточность. Процесс. С потоками он работает примерно так же.

Вот пример: http://wiki.wxpython.org/MultiProcessing

0 голосов
/ 18 мая 2010

wx.CallAfter (функция)

...