Сделать обратный вызов из подкласса потока в основном потоке - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть класс, который наследует от потоков.После обработки элемента из очереди я хочу, чтобы он вызывал функцию, которую я передал потоку при запуске.При выполнении этого обратного вызова из метода run-метода он будет запущен в моем рабочем потоке.Есть ли способ запустить этот обратный вызов внутри MainThread?

Спасибо и привет, Шон

Ответы [ 3 ]

3 голосов
/ 01 февраля 2012

Вы изначально не упомянули, что используете pyqt. Qt имеет встроенные сигналы и слоты для этой цели. Если вы запускаете свой поток с помощью QThread, то у него есть сигнал «готово», к которому ваш основной поток может быть подключен через слот. Если вам нужен еще больший контроль над результирующим сигналом, вы можете испустить пользовательский сигнал из потока с любым желаемым значением. Когда вы создаете поток, просто подключите его сигнал к слоту, который вы хотите использовать в качестве обратного вызова. В противном случае вы бы заблокировали свой главный цикл обработки событий, если вы конкретно ожидаете в потоке.

Вот ссылка конкретно о новом стиле сигнала / слотов: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

Теперь стало чрезвычайно легко создавать сигнал python с любой сигнатурой, которую вы хотите, и подключать его объектно-ориентированным способом к слоту.

Также в качестве дополнительного примечания о PyQt ... Некоторые другие ответы здесь предлагают создать цикл в главном потоке, который ожидает сбора ответов в очереди из отправленных потоков. Это по сути то, что делает PyQt. Когда вы запускаете приложение, основной поток переходит в цикл обработки событий. Этот цикл обработки событий обрабатывает события, которые складываются в его очереди событий. Существуют разные типы соединений сигнал / слот. Если ваши две конечные точки находятся в одном потоке, то будет установлено прямое соединение, и излучающий сигнал вызовет слот. Если они находятся в разных потоках, то я считаю, что он проходит цикл обработки событий, так что он может обрабатываться вне потока эмиттеров.

0 голосов
/ 01 февраля 2012

Вы можете использовать условные переменные, и ваш основной поток ожидает сообщения из подпотока.Подпоток может сигнализировать основному потоку о вызове этого метода.

0 голосов
/ 01 февраля 2012

Поместите метод в очередь, и основной поток будет сидеть и ждать в этой очереди, выполняя каждый метод, когда он их вытягивает.

...