QThread останавливает обработку события - PullRequest
0 голосов
/ 13 февраля 2019

Я хотел бы запустить поток с PyQt, который выполняет некоторые действия независимо от остальной части приложения.Это включает в себя запуск внешней программы.Это может занять несколько минут.

Моя проблема в том, что использование QThread для этого останавливает все приложение.При запуске этой маленькой программы нажатие кнопки заморозит приложение на 10 секунд.

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

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QThread

class ProgramThread(QThread):
    def __init__(self):
        QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):
        QThread.sleep(10)

class App(QWidget):
    def __init__(self):
        super().__init__()
        thread = QPushButton('Start Thread',self)
        thread.clicked.connect(self.startthread)
        thread.move(20,100)
        self.show()

    def startthread(self):
        t = ProgramThread()
        t.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 13 февраля 2019

QThread это не поток, это обработчик потока.В вашем случае проблема в том, что переменная t является локальной, поэтому она будет удалена после выполнения запуска, в этот момент вызывается метод __del__, и это вызывает wait(), который выполняется в главном потоке, блокирующем графический интерфейс, этоблокировка Это будет происходить до тех пор, пока метод run не завершит выполнение, поэтому в заключение проблема заключается в том, что t является локальной переменной, решение состоит в том, чтобы сохранить ее во времени, так что есть две возможности: 1) передать ее в self в качестве родителя или2) сделать его членом класса:

class ProgramThread(QThread):
    def run(self):
        QThread.sleep(10)

    def __del__(self):
        self.wait()

class App(QWidget):
    def __init__(self):
        super().__init__()
        thread = QPushButton('Start Thread',self)
        thread.clicked.connect(self.startthread)
        thread.move(20,100)
        self.show()

    def startthread(self):
        # method 1
        t = ProgramThread(self)
        t.start()
        # method 2
        # self.t = ProgramThread()
        # self.t.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...