Buscar..


Observaciones

Si bien algunas partes del marco Qt son seguras para subprocesos, muchas de ellas no lo son. La documentación de Qt C ++ proporciona una buena visión general de qué clases son reentrantes (se pueden usar para crear instancias de objetos en varios subprocesos). Las siguientes reglas son las más buscadas:

  • No puede crear o acceder a un objeto de la GUI de Qt desde fuera del hilo principal (por ejemplo, cualquier subclase QWidget o similar).
  • Incluso si la clase Qt es reentrada, no puede compartir el acceso a un objeto Qt entre subprocesos a menos que la documentación de Qt para esa clase indique explícitamente que las instancias son seguras para subprocesos.
  • Puede usar QObject.moveToThread() si necesita mover un objeto Qt de un hilo a otro (no se aplica a los objetos de la GUI de Qt, que siempre deben permanecer en el hilo principal). Pero tenga en cuenta que el objeto no debe tener un padre.

Según este control de calidad de desbordamiento de pila, no se recomienda utilizar los hilos de Python si su hilo tiene la intención de interactuar con PyQt de alguna manera (incluso si esa parte del marco Qt es seguro para los hilos).

El modelo trabajador

# this method can be anything and anywhere as long as it is accessible for connection
@pyqtSlot()
def run_on_complete():
   
    pass

# An object containing methods you want to run in a thread
class Worker(QObject):
    complete = pyqtSignal()
    
    @pyqtSlot()
    def a_method_to_run_in_the_thread(self):
        # your code
        
        # Emit the complete signal
        self.complete.emit() 

# instantiate a QThread
thread = QThread()
# Instantiate the worker object
worker = Worker()
# Relocate the Worker object to the thread
worker.moveToThread(thread)
# Connect the 'started' signal of the QThread to the method you wish to run
thread.started.connect(worker.a_method_to_run_in_the_thread)
# connect to the 'complete' signal which the code in the Worker object emits at the end of the method you are running
worker.complete.connect(run_on_complete)
# start the thread (Which will emit the 'started' signal you have previously connected to)
thread.start()


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow