«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как обмениваться данными между главным окном и потоками в PyQt: прямая ссылка против сигналов и слотов?

Как обмениваться данными между главным окном и потоками в PyQt: прямая ссылка против сигналов и слотов?

Опубликовано 6 ноября 2024 г.
Просматривать:865

How to Share Data Between the Main Window and Threads in PyQt: Direct Reference vs. Signals and Slots?

Обмен данными между главным окном и потоком в 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__()
        # ...

Какой вариант использовать?

Выбор зависит от потребностей потока и требуемого уровня контроля.

  • Вариант 1 предлагает прямой доступ к данным главного окна, но может оказаться не столь масштабируемым для более сложного обмена данными.
  • Вариант 2 обеспечивает потокобезопасность и поддерживает более гибкую связь шаблоны.

Соображения безопасности потоков

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

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3