Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo detener el subproceso múltiple en Pyqt5

Cómo detener el subproceso múltiple en Pyqt5

A continuación se utiliza un ejemplo sencillo para mostrar cómo utilizar la señal/ranura de señal para salir de un hilo.

Si hay un botón, haga clic para iniciar el hilo y haga clic nuevamente para salir del hilo. El trabajo del hilo es imprimir a (1-20) y luego b (1-20). El código es el siguiente:

[python]?view Plain?copy

class?UpdateThread(QThread):?

def?__init__(self,?parent =None):?

super(UpdateThread,?self).__init__(parent)?

self.flag?=?1#?Un indicador utilizado para determinar si el bucle continúa Cambiar la bandera hace que la función de ejecución en el hilo salga ?

def?run(self):?

table?=?['a',?'b'. ,?'c',?'d?',?' e',?'f',?'g']?

para?i?in?range(6):?

if?self.flag?==?1 :?

imprimir?tabla[i]?

for?m?in?range(20):?

imprimir?m?

tiempo.dormir(0.5)?

otro:?

descanso?

print?'close'#?La salida indica que la función de ejecución del hilo ha salido ?

def?stop(self):?

print?'setting?flag?false'?

self.flag?=?0?

print?self.flag?Al principio, debido a que los subprocesos de Python no tenían una API para la salida de subprocesos, aprendí que QThread tiene API para bloqueo de subprocesos, salida, salida forzada, etc., por lo que heredé el subproceso de QThread, pero en la interfaz gráfica de usuario escribir mythread.wait() o quit() o terminate() en la lógica del botón de la interfaz no afectará el subproceso ( tal vez el mecanismo de señal y ranura no se usó en ese momento, por lo que no funcionó), y luego escriba una función de parada usted mismo. Se usa para modificar un indicador en el hilo para detener el bucle en la función de ejecución, y luego como se muestra en el código anterior, escriba lo siguiente en la lógica del botón (demostración de error):

[python]?view Plain?

def?update_db():#?error?

self.new_thread1?=?UpdateDbThread()?

if?self.update_tag?== ?0:?

self.update_tag?=?1?

self.new_thread1.start()?

otro:?

self.update_tag?=?0?

self.new_thread1 .stop()?

Después de ejecutar, se descubrió que aunque la función de parada cambió el valor de self.flag, la declaración de juicio en el bucle El valor de la bandera sigue siendo 1 y el bucle tiene no se detuvo Luego verifiqué la información y fui a stackoverflow para encontrar la respuesta. Finalmente, descubrí que el hilo necesita responder a través del mecanismo de señal y ranura, así que verifiqué la información relevante de la señal/ranura de Qt. de la siguiente manera:

[python]?view Plain?copy

class?mywidget(Qwidget):

sin?=?pyqtSignal()#? ¿avance?

def?__init__(self):?

...?

self.new_thread1?=?UpdateDbThread()?

self.pecado.con

nect(self.new_thread1.stop)?

def?update_db():?

if?self.update_tag?==?0:

self. update_tag?=?1?

self.new_thread1.start()

otro:

self.update_tag?=?0

self.sin.emit()?

[python]?ver plano?copia

La definición de la señal pyqtSignal no se puede escribir en el método update_db, ni se puede escribir en el método de inicialización init(), por las siguientes razones (de stackoverflow):

Entonces definimos la señal antes del método init sin, y luego conéctese al método de parada del hilo. Al hacer clic en el botón para enviar una señal, se cambia la bandera del hilo y luego se sale del bucle. Los resultados de la ejecución son los siguientes:

Para facilitar el mapeo, cambié la salida del bucle a 10:

p>

El hilo es normal Salida, objetivo cumplido. Puede anular el método de ejecución según sus necesidades.

También debe tenerse en cuenta que no se puede escribir mythread = update_db() en el método; de lo contrario, se informará un error en tiempo de ejecución y se destruirá mientras se ejecuta el subproceso, porque mythread es una variable local en el método. Cuando finaliza el método, el mecanismo de recolección de basura de Python se destruirá automáticamente y luego ocurrirá el error anterior, por lo que se debe agregar self delante de mythread para convertir el hilo en una variable global.