#python-3.x #pyqt5 #signals-slots
Вопрос:
Я учусь использовать PyQt5, и есть довольно много моментов, которые ускользают от меня.
Я начал реализовывать QThreads, чтобы заменить потоки, которые я использовал в своем пользовательском интерфейсе, поскольку я понял, что смешивание потоков и QThreads может привести к проблемам позже, и одновременно начал использовать pyqtSignal
До сих пор я видел, что pyqtSygnal должен быть реализован на уровне класса, чтобы иметь возможность работать ( помещение его в конструктор класса не работает )
В архитектуре, которую я использую в настоящее время, у меня есть pyqtSignal, который создается в основном потоке и затем используется всеми дочерними потоками. Это связано с наличием одного класса, который отвечает за мои журналы всей программы.
Я не уверен, является ли это хорошей реализацией или нет.
Вот мои вопросы :
- являются ли pyqtSignals потокобезопасными ?
Я знаю, что они используют систему очередей для обеспечения потокобезопасности, но являетсяemit()
ли сам метод потокобезопасным ? Мое понимание их немного ограничено - Нужно ли мне защищать свои pyqtSignals блокировками ?
- Могу ли я иметь несколько разных сигналов, излучаемых в один и тот же слот, без каких-либо проблем ?
Комментарии:
1. Можете ли вы уточнить, что вы подразумеваете под «одним из pyqtSignals, который я использую, совместно используется несколькими QThreads»? Вы имеете в виду, что используете несколько экземпляров подкласса QThread, у которого есть пользовательский сигнал?
2. отредактировал мой вопрос для ясности. В настоящее время у меня нет QThreads, но обычные потоки ( еще не закончили реализацию QThreads ). То, как я реализую эту вещь, у меня были бы QThreads, которые используют тот же pyqtSignal, который реализован в основном потоке, а затем предоставлен для использования QThreads. Не пошел дальше, так как понял, что это может быть не очень хорошей идеей ( я не видел, чтобы pyqtSignals реализовывались таким образом), но изо всех сил пытаюсь понять, что делать / не делать.
3. С точки зрения ООП (особенно инкапсуляции), вы должны излучать сигнал от объекта, который «концептуально» сигнализирует. Таким образом, вы не должны излучать сигнал другого объекта, а создавать пользовательские сигналы в подклассе QThread и излучать оттуда. В попытке испустить сигнал из другого источника практически нет никакой пользы.
4. Спасибо, я действительно думаю, что это хорошая практика, и на последнем этапе ее будет легче отлаживать / исправлять
Ответ №1:
Сигналы являются одним из немногих элементов QObjects, которые являются потокобезопасными, поэтому нет необходимости защищать данные. Таким образом, вы можете подключать разные типы сигналов к одному и тому же слоту.
Поскольку сигналы потокобезопасны, Qt рекомендует передавать объекты QObject, которые находятся в разных потоках.