Обмен данными между главным окном и потоком в приложениях PyQt
Потоки полезны для выполнения задач без блокировки главного окна. Однако доступ к данным из главного окна внутри потока представляет собой проблему. Давайте рассмотрим подходящий метод обмена данными с использованием PyQt.
Неэффективные методы:
1. Передача ссылки на окно в поток:
Хотя это обеспечивает прямой доступ к переменным главного окна, это нарушает принципы безопасности потоков. Виджеты не являются реентерабельными, и доступ к ним должен осуществляться только из основного потока.
2. Поддержание копий переменных, синхронизированных с потоком:
Этот метод требует частой синхронизации данных, что приводит к сложности кода и потенциальным состояниям гонки.
3. Использование глобальных переменных:
Глобальные переменные не рекомендуется использовать в многопоточных средах. Одновременный доступ к ним может привести к непредсказуемым результатам.
Рекомендуемый метод:
Использование сигналов и слотов:
Это рекомендуемый подход в PyQt . Сигналы и слоты обеспечивают потокобезопасный механизм связи между потоками. Следующие шаги описывают, как использовать сигналы и слоты для обмена данными:
1. Создать сигнал в рабочем потоке:
# in worker thread
class Worker(QtCore.QThread):
...
# Create signal named "beep"
beep = QtCore.pyqtSignal(int)
2. Выдать сигнал из рабочего потока:
# in worker thread
def run(self):
...
# emit "beep" signal with current count
self.beep.emit(count)
3. Подключите слот к сигналу в главном окне:
# in main window
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update) # update槽函数
4. Реализация функции слота в главном окне:
# in main window
def update(self, count):
...
# update GUI elements using count
5. Обновить общие данные из главного окна:
# in main window
self.spinbox.valueChanged.connect(self.worker.update_value) # update_value槽函数
6. Реализация функции Slot в рабочем потоке:
# in worker thread
class Worker:
...
def update_value(self, value):
# Update sleep time in worker thread
Выполняя эти шаги, вы можете безопасно и эффективно обмениваться данными между потоком и главным окном в приложениях PyQt.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3