Безопасные и ленивые вызовы методов в PySide / PyQt - PullRequest
5 голосов
/ 03 сентября 2011

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

my_driver.invoke_method.emit('method_name', [arg, ...], {kwarg, ...})

Очевидно, что это напрямую обращается к атрибуту сигнала в этом другом потоке ...но я не уверен, что это нормально в мире GIL.

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

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

1 Ответ

4 голосов
/ 03 сентября 2011

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

Обсуждаемый подход является очень общим, использующим Queue.Queue, и может показаться излишним для простых задач (но я просто хочу вызвать «эту» функцию в потоке). Однако, как только ваше приложение станет нетривиальным, вы по достоинству оцените его, поскольку оно позволяет избежать любых проблем с синхронизацией потоков и является очень масштабируемым. Я лично использовал его для реализации сложных графических интерфейсов PyQt с побочными потоками, выполняющими все виды вещей.

...