Обмен данными между главным окном и потоком в PyQt
Многопоточным приложениям часто необходимо обмениваться данными между потоком главного окна и рабочими потоками. Чтобы обеспечить потокобезопасность и правильную связь, PyQt предлагает несколько практических подходов.
Вариант 1: прямая ссылка на главное окно
В этом подходе ссылка на главное окно окно передается в поток. Затем поток может напрямую получить доступ к данным в главном окне, например к значению счетчика.
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker(self)
# ...
class Worker(QtCore.QThread):
def __init__(self, host_window):
super(Worker, self).__init__()
self.host = host_window
# ...
Вариант 2: сигналы и слоты
PyQt использует сигналы и слоты для взаимодействия между объектами. При таком подходе рабочий поток излучает сигналы при изменении данных, а функции слота главного окна обрабатывают обновления.
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker()
self.worker.beep.connect(self.update)
# ...
class Worker(QtCore.QThread):
beep = QtCore.pyqtSignal(int)
def __init__(self):
super(Worker, self).__init__()
# ...
Какой вариант использовать?
Выбор зависит от потребностей потока и требуемого уровня контроля.
Соображения безопасности потоков
Виджеты не являются потокобезопасными. Поэтому крайне важно использовать сигналы и слоты для управления связью между потоком и главным окном. Прямое манипулирование виджетами из нескольких потоков может привести к неожиданному поведению.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3