Compartir datos entre la ventana principal y el hilo en aplicaciones PyQt
Los hilos son útiles para realizar tareas sin bloquear la ventana principal. Sin embargo, acceder a los datos desde la ventana principal dentro de un hilo presenta un desafío. Exploremos el método apropiado para compartir datos usando PyQt.
Métodos ineficientes:
1. Pasar la referencia de la ventana al subproceso:
Si bien esto permite el acceso directo a las variables de la ventana principal, viola los principios de seguridad de los subprocesos. Los widgets no son reentrantes y solo se debe acceder a ellos desde el hilo principal.
2. Mantener copias de variables sincronizadas con subprocesos:
Este método requiere una sincronización frecuente de datos, lo que genera complejidad en el código y posibles condiciones de carrera.
3. Uso de variables globales:
No se recomiendan las variables globales en entornos multiproceso. Acceder a ellos simultáneamente puede provocar resultados impredecibles.
Método recomendado:
Uso de señales y ranuras:
Este es el enfoque recomendado en PyQt . Las señales y las ranuras proporcionan un mecanismo seguro para subprocesos para la comunicación entre subprocesos. Los siguientes pasos describen cómo utilizar señales y ranuras para compartir datos:
1. Crear señal en el hilo del trabajador:
# in worker thread
class Worker(QtCore.QThread):
...
# Create signal named "beep"
beep = QtCore.pyqtSignal(int)
2. Emitir señal desde el hilo de trabajo:
# in worker thread
def run(self):
...
# emit "beep" signal with current count
self.beep.emit(count)
3. Conecte la ranura a la señal en la ventana principal:
# in main window
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update) # update槽函数
4. Implementar la función de ranura en la ventana principal:
# in main window
def update(self, count):
...
# update GUI elements using count
5. Actualizar datos compartidos desde la ventana principal:
# in main window
self.spinbox.valueChanged.connect(self.worker.update_value) # update_value槽函数
6. Implementar la función de ranura en el hilo de trabajo:
# in worker thread
class Worker:
...
def update_value(self, value):
# Update sleep time in worker thread
Al seguir estos pasos, puede compartir datos de forma segura y eficiente entre un hilo y la ventana principal de las aplicaciones PyQt.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3