wxpython - потоки и события окна

У меня есть приложение wxPython (http://www.OpenSTV.org), который подсчитывает бюллетени, используя методы, которые имеют несколько раундов. Я'Я хотел бы сделать две вещи:

(1) Для большого количества бюллетеней это может быть немного медленным, поэтому яЯ хотел бы показать пользователю диалог прогресса, чтобы он неЯ думаю, что приложение заморожено.

(2) яЯ хотел бы позволить пользователю разорвать связи вручную, и для этого требуется код счета, чтобы отобразить диалоговое окно.

Для достижения (1) я создаю поток для запуска кода подсчета, и это позволяет мне представить пользователю приятный диалог прогресса.

Однако проблема заключается в том, что код подсчета не является основным потоком, и только основной поток в wxPython может обрабатывать события окна.

Я полагаю, я мог бы создать поток для запуска диалога прогресса, но это кажется неудобным. Есть ли лучший способ выполнить оба (1) и (2)?

Ответы на вопрос(2)

Решение Вопроса

использованиеОчередь общаться и синхронизировать между потоками, с каждым потокомвладеющий» и исключительно взаимодействуя с ресурсом, которыйне удобно делиться

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

Для (1), когда ваша подсчитывающая нить имеет обновление, она должнаput это в очередь, где ожидает основной поток; когда ваш основной поток получает подходящее сообщение в этой очереди, он обновляет диалоговое окно прогресса.

Для (2) поток подсчета отправляетпусть пользователь порвет галстук запрос, главный поток получает его и отвечает соответствующим образом, и отправляет обратно разрешение в отдельной очереди.

Итак, в общем, есть два вида связи: один, который нене требует ответа, и другие, которые делают. Для первого типа просто поместите уведомление в соответствующую очередь и просто продолжайте - оно будет выполнено в должное время. Для последнего вида моя любимая идиома - поставить в соответствующую очередь пару (request, response_queue). Если в остальном идентичные запросы различаются тем, что некоторым нужен ответ, а другим нетt, постановка в очередь (запрос, нет), когда ответ не требуется (и (запрос, q), где q '«Очередь, когда нужен ответ») - это также хорошая, простая и общая идиома.

Есть несколько способов вызвать основной поток потоком wxPython из потока процесса. Самый простойwx.CallAfter () который всегда будет выполнять функционал, переданный ему в основном потоке. Вы также можете использоватьwx.PostEvent () и там'Примером этого является демонстрация (помеченная как Threads), и есть несколько более сложных, но более настраиваемых способов, которые обсуждаются в последней главеwxPython в действии.

 gaefan30 сент. 2009 г., 18:28
Я вижу, как это позволит мне запустить диалог разрыва связей в главном потоке, но позволит ли какой-либо из них основному потоку связаться с подсчитывающим потоком? Поток подсчета должен знать, как пользователь разорвал связь, прежде чем он сможет продолжить. Возможно, мне нужна очередь для этого.
 RufusVS18 окт. 2016 г., 17:23
Любая функция, которая вызывается функцией wx.CallAfter (), может также вызывать метод или напрямую изменять атрибут в объекте потока.
 tom1030 сент. 2009 г., 20:02
Джефф - Да, они просто общаются с главным потоком.

Ваш ответ на вопрос