TransWikia.com

RuntimeError: cannot set daemon status of active thread

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 claseHilo()` 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

introducir la descripción de la imagen aquí

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_()

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP