Сигналы Python Threads асинхронные - PullRequest
0 голосов
/ 14 марта 2019

У меня есть основной поток, который я хочу неблокировать (он включает в себя PyQt5 GUI, я не могу использовать соединение)

Из этого потока я порождаю дочерний поток, выполняющий действие.

Я хочу запустить другое действие из основного потока после завершения дочернего потока.

Полагаю, я должен сгенерировать сигнал от ребенка, когда это будет сделано, и поймать его в основном. Есть ли фрагмент, показывающий, как правильно реализовать это?

1 Ответ

1 голос
/ 14 марта 2019

Уже есть встроенный сигнал, называемый законченным, поэтому вы можете подключить его к вашему методу процесса:

class NewThread(QtCore.QThread):
    def run(self):
        pass

class MainWidget(QtWidgets.QWidget):
    def after_thread_done(self):
        pass

    def __init__(self):
        self.thread = NewThread()
        self.thread.finished.connect(self.after_thread_done)

Если вы хотите излучать сигнал вручную, вы можете определить новый сигнал:

class NewThread(QtCore.QThread):
    new_signal = QtCore.pyqtSignal()

    def run(self):
        ...
        self.new_signal.emit()
        ...

Затем подключите его к вашему методу процесса с помощью тех же кодов.

Если вы хотите определить сигналы в MainWidget, вы можете передать main_widget как родительский поток.

class NewThread(QtCore.QThread):
    def run(self):
        ...
        self.parent().signal.emit()
        ...

class MainWidget(QtWidgets.QWidget):
    new_signal = QtCore.pyqtSignal()

    def after_thread_done(self):
        print("done")

    def __init__(self):
        self.new_signal.connect(self.after_thread_done)
        self.thread = NewThread(self)
        self.thread.start()
...