QThread все еще работает после основного l oop die - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над софтом, который должен подсчитывать электронные письма в Outlook Ave c обновлять количество каждые x минут.

Я создал QThread, чтобы выполнить эту задачу, которая заморозит мой GUI.

Все работает нормально, но, когда я выхожу из программного обеспечения, поток все еще работает, потому что я использовал бесконечность l oop, чтобы можно было постоянно обновлять сумму.

Я нашел решение, объявив глобальную переменную и локальную переменную с приращением по сигналу. My while l oop сравните их и продолжите, если все в порядке.

Поскольку Qthread не имеет метода isDaemon, я не уверен, что поток действительно мертв и не просто больше не выполняет видимую задачу.

Вот пример мой код:

continuation=1
class App_Direction(QtWidgets.QWidget):</p>

<code>    def __init__(self):
        super(App_Direction,self).__init__()
        self.setWindowTitle("test")   
        self.resize(1000,1050)
        self.move(1500,100)
        self.setStyleSheet("font: 10pt;")
        self.feed_stats_label()

    @QtCore.pyqtSlot(int)    
    def feed_stats_label(self):
        self.workthread=WorkerThread()
        self.workthread.mail_sig.connect(self.modif)
        self.workthread.continuation_sig.connect(self.continuation)
        self.workthread.start()

    @QtCore.pyqtSlot(list)
    def modif (self,liste=()):
        print("Je ne recois plus le signal, car je suis mort")

    @QtCore.pyqtSlot(list)
    def continuation(self, arg):
        global continuation
        continuation+=1

class WorkerThread(QtCore.QThread):
    mail_sig = QtCore.pyqtSignal(list) 
    continuation_sig=QtCore.pyqtSignal(list)

    def __init__(self, parent=None):
        super().__init__(parent)         
    def run(self):   


        self.continuation=1
        global continuation
        while self.continuation==continuation:
        print("Et ca continue encore et encore")
        self.mail_sig.emit([]) # envoi du signal de progression d'exécution
        self.continuation+=1
        self.continuation_sig.emit([self.continuation])
        time.sleep(10) 
if __name__ == '__main__':
    QtWidgets.QApplication.setStyle("Fusion")   
    app=QtWidgets.QApplication ([])
    win= App_Direction()
    win.show()      
    app.exec_()<code>
</code>

1 Ответ

0 голосов
/ 29 мая 2020

Хотя QThread не имеет флага Daemon, он действует как Daemon. Рассмотрим свой пример с удаленной переменной продолжения (и некоторым рефакторингом):

from PyQt5 import QtWidgets, QtCore
import time


class AppDirection(QtWidgets.QWidget):

    def __init__(self):
        super(AppDirection, self).__init__()
        self.setWindowTitle("test")
        self.resize(800, 600)
        self.setStyleSheet("font: 10pt;")
        self.work_thread = None
        self.feed_stats_label()

    @QtCore.pyqtSlot(int)
    def feed_stats_label(self):
        self.work_thread = WorkerThread()
        self.work_thread.mail_sig.connect(self.modif)
        self.work_thread.start()

    @QtCore.pyqtSlot()
    def modif(self):
        print("I am receiving the signal")


class WorkerThread(QtCore.QThread):
    mail_sig = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)

    def run(self):
        while True:
            print("I am sending the signal.")
            self.mail_sig.emit()
            time.sleep(0.5)


if __name__ == '__main__':
    QtWidgets.QApplication.setStyle("Fusion")
    app = QtWidgets.QApplication([])
    win = AppDirection()
    win.show()
    app.exec_()

Когда вы закрываете окно, поток также прекращает печать.

...