"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como compartilhar dados entre a janela principal e threads no PyQt: referência direta versus sinais e slots?

Como compartilhar dados entre a janela principal e threads no PyQt: referência direta versus sinais e slots?

Publicado em 2024-11-06
Navegar:723

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

Compartilhando dados entre a janela principal e o thread no PyQt

Aplicativos multithread geralmente precisam compartilhar dados entre o thread da janela principal e os threads de trabalho. Para garantir a segurança do thread e a comunicação adequada, o PyQt oferece várias abordagens práticas.

Opção 1: referência direta à janela principal

Nesta abordagem, uma referência à janela principal janela é passada para o thread. O thread pode então acessar diretamente os dados na janela principal, como o valor de uma caixa giratória.

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
        # ...

Opção 2: Sinais e Slots

PyQt usa sinais e slots para se comunicar entre objetos. Nesta abordagem, o thread de trabalho emite sinais quando os dados mudam, e as funções do slot da janela principal lidam com as atualizações.

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__()
        # ...

Qual opção usar?

A escolha depende das necessidades do thread e do nível de controle necessário.

  • Opção 1 oferece acesso direto aos dados da janela principal, mas pode não ser tão escalonável para compartilhamento de dados mais complexos.
  • Opção 2 garante segurança de thread e suporta comunicação mais flexível padrões.

Considerações sobre segurança de thread

Widgets não são thread-safe. Portanto, é crucial usar sinais e slots para lidar com a comunicação entre o thread e a janela principal. A manipulação direta de widgets de vários threads pode levar a um comportamento inesperado.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3