Stack Overflow en español Asked on November 13, 2021
Contexto:
La clase “Main()es la encargada de ejecutar todas las funciones principales del programa, adicionalmente a esto la clase
Hilo()` se encarga de ejecutar una función en un hilo diferente.
Problema:
Al iniciar el programa la primera vez se ejecuta sin problema pero cuado el programa se vuelve a ejecutar lanza el siguiente error: raise RuntimeError("cannot set daemon status of active thread") RuntimeError: cannot set daemon status of active thread
Funcionamiento
Traceback
Traceback (most recent call last):
File "D:Practicas PythonDetener HilosTestThreading.py", line 23, in <lambda>
self.Next.clicked.connect(lambda:self.Fun1())
File "D:Practicas PythonDetener HilosTestThreading.py", line 36, in Fun1
self.Hilo.daemon = True
File "C:UsersAngel-HpAppDataLocalProgramsPythonPython36libthreading.py", line 1141, in daemon
raise RuntimeError("cannot set daemon status of active thread")
RuntimeError: cannot set daemon status of active thread
[Finished in 39.5s]
Codigo:
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5 import QtCore,QtGui
from PyQt5 import uic
import threading
import time
class Hilo(threading.Thread):
def __init__(self,obj,fun):
threading.Thread.__init__(self)
self.fun = fun
self.obj = obj
def run(self):
self.fun()
class Main(QMainWindow):
signal = QtCore.pyqtSignal(object)
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("Test.ui",self)
self.Next.clicked.connect(lambda:self.Fun1())
self.Back.clicked.connect(lambda:self.tabWidget.setCurrentIndex(0))
self.signal.connect(self.Fun2)
self.Hilo = Hilo(self,self.FunX)
def Fun1(self):
_movie = QtGui.QMovie("Loader.gif")
self.label.setMovie(_movie)
self.label.setScaledContents(True)
_movie.start()
self.Hilo.daemon = True
self.Hilo.start()
def FunX(self):
print(threading.enumerate())
time.sleep(5)
self.signal.emit(0)
def Fun2(self,valor):
if valor == 0:
self.label.setPixmap(QtGui.QPixmap("Confirmacion.png"))
QtCore.QTimer.singleShot(2000,lambda:self.tabWidget.setCurrentIndex(1))
self.Hilo._stop()
print(threading.enumerate())
app = QApplication([])
m = Main()
m.show()
app.exec_()
El problema como lo indica el Traceback
es que como se esta declarando la clase Hilo
que contiene al nuevo thread
dentro de la funcion __init__
el nuevo thread
se inicia al momento de iniciar el programa y se mantiene vivo debido a que la funcion __init__
no se ha terminado de ejecutar.
Por lo que la solución es declarar al hilo dentro de la funcion Fun()
de esta manera de crea una nueva instancia de la clase cada vez que se oprima el botón detonante y el hilo no permanece siempre vivo o activo
class Main(QMainWindow):
signal = QtCore.pyqtSignal(object)
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("Test.ui",self)
self.Next.clicked.connect(lambda:self.Fun1())
self.Back.clicked.connect(lambda:self.tabWidget.setCurrentIndex(0))
self.signal.connect(self.Fun2)
self.Hilo = Hilo(self,self.FunX) #<-- Eliminar esta linea
def Fun1(self):
_movie = QtGui.QMovie("Loader.gif")
self.label.setMovie(_movie)
self.label.setScaledContents(True)
_movie.start()
self.Hilo = Hilo(self,self.FunX) #<-- Añadir esta linea
self.Hilo.setDaemon(True)
self.Hilo.start()
Answered by Angel Judath Alvarez on November 13, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP