QObject e QThread: código comentado

This commit is contained in:
Luiz Otávio
2023-03-11 11:28:45 -03:00
parent d0c9e3c013
commit 0b0a6c7989

View File

@@ -21,87 +21,129 @@ class Worker1(QObject):
self.finished.emit(value) self.finished.emit(value)
class Worker2(QObject):
started = Signal(str)
progressed = Signal(str)
finished = Signal(str)
def executeMe(self):
value = '0'
self.started.emit(value)
for i in range(50, 100, 5):
value = str(i)
self.progressed.emit(value)
time.sleep(0.3)
self.finished.emit(value)
class MyWidget(QWidget, Ui_myWidget): class MyWidget(QWidget, Ui_myWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setupUi(self) self.setupUi(self)
self.button1.clicked.connect(self.hardWork1) self.button1.clicked.connect(self.hardWork1) # type: ignore
self.button2.clicked.connect(self.hardWork2) self.button2.clicked.connect(self.hardWork2) # type: ignore
def hardWork1(self): def hardWork1(self):
self._worker = Worker1() self._worker1 = Worker1()
self._thread = QThread() self._thread1 = QThread()
worker = self._worker # Isso garante que o widget vai ter uma referência para worker e thread
thread = self._thread worker = self._worker1
thread = self._thread1
# Mover o worker para a thread # Worker é movido para a thread. Todas as funções e métodos do
# objeto de worker serão executados na thread criado pela QThread.
worker.moveToThread(thread) worker.moveToThread(thread)
# Run # Quando uma QThread é iniciada, emite o sinal started automaticamente.
thread.started.connect(worker.doWork) thread.started.connect(worker.doWork) # type: ignore
# O sinal finished é emitido pelo objeto worker quando o trabalho que
# ele está executando é concluído. Isso aciona o método quit da qthread
# que interrompe o loop de eventos dela.
worker.finished.connect(thread.quit) worker.finished.connect(thread.quit)
thread.finished.connect(thread.deleteLater) # deleteLater solicita a exclusão do objeto worker do sistema de
# gerenciamento de memória do Python. Quando o worker finaliza, ele
# emite um sinal finished que vai executar o método deleteLater.
# Isso garante que objetos sejam removidos da memória corretamente.
thread.finished.connect(thread.deleteLater) # type: ignore
worker.finished.connect(worker.deleteLater) worker.finished.connect(worker.deleteLater)
# Aqui estão seus métodos e início, meio e fim
# execute o que quiser
worker.started.connect(self.worker1Started) worker.started.connect(self.worker1Started)
worker.progressed.connect(self.worker1Progressed) worker.progressed.connect(self.worker1Progressed)
worker.finished.connect(self.worker1Finished) worker.finished.connect(self.worker1Finished)
# Inicie a thread
thread.start() thread.start()
def worker1Started(self, value): def worker1Started(self, value):
self.button1.setDisabled(True) self.button1.setDisabled(True)
self.label1.setText(value) self.label1.setText(value)
print('worker iniciado') print('worker 1 iniciado', value)
def worker1Progressed(self, value): def worker1Progressed(self, value):
self.label1.setText(value) self.label1.setText(value)
print('em progresso') print('1 em progresso', value)
def worker1Finished(self, value): def worker1Finished(self, value):
self.label1.setText(value) self.label1.setText(value)
self.button1.setDisabled(False) self.button1.setDisabled(False)
print('worker finalizado') print('worker 1 finalizado', value)
def hardWork2(self): def hardWork2(self):
self._worker2 = Worker1() self._worker2 = Worker2()
self._thread2 = QThread() self._thread2 = QThread()
# Isso garante que o widget vai ter uma referência para worker e thread
worker = self._worker2 worker = self._worker2
thread = self._thread2 thread = self._thread2
# Mover o worker para a thread # Worker é movido para a thread. Todas as funções e métodos do
# objeto de worker serão executados na thread criado pela QThread.
worker.moveToThread(thread) worker.moveToThread(thread)
# Run # Quando uma QThread é iniciada, emite o sinal started automaticamente.
thread.started.connect(worker.doWork) # Nome do método "doWork" modificado para "executeMe" (p/ exemplo)
thread.started.connect(worker.executeMe) # type: ignore
# O sinal finished é emitido pelo objeto worker quando o trabalho que
# ele está executando é concluído. Isso aciona o método quit da qthread
# que interrompe o loop de eventos dela.
worker.finished.connect(thread.quit) worker.finished.connect(thread.quit)
thread.finished.connect(thread.deleteLater) # deleteLater solicita a exclusão do objeto worker do sistema de
# gerenciamento de memória do Python. Quando o worker finaliza, ele
# emite um sinal finished que vai executar o método deleteLater.
# Isso garante que objetos sejam removidos da memória corretamente.
thread.finished.connect(thread.deleteLater) # type: ignore
worker.finished.connect(worker.deleteLater) worker.finished.connect(worker.deleteLater)
# Aqui estão seus métodos e início, meio e fim
# execute o que quiser
worker.started.connect(self.worker2Started) worker.started.connect(self.worker2Started)
worker.progressed.connect(self.worker2Progressed) worker.progressed.connect(self.worker2Progressed)
worker.finished.connect(self.worker2Finished) worker.finished.connect(self.worker2Finished)
# Inicie a thread
thread.start() thread.start()
def worker2Started(self, value): def worker2Started(self, value):
self.button2.setDisabled(True) self.button2.setDisabled(True)
self.label2.setText(value) self.label2.setText(value)
print('worker 2 iniciado') print('worker 2 iniciado', value)
def worker2Progressed(self, value): def worker2Progressed(self, value):
self.label2.setText(value) self.label2.setText(value)
print('2 em progresso') print('2 em progresso', value)
def worker2Finished(self, value): def worker2Finished(self, value):
self.label2.setText(value) self.label2.setText(value)
self.button2.setDisabled(False) self.button2.setDisabled(False)
print('2 worker finalizado') print('worker 2 finalizado', value)
if __name__ == '__main__': if __name__ == '__main__':