QObject e QThread: código comentado
This commit is contained in:
@@ -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__':
|
||||||
|
|||||||
Reference in New Issue
Block a user