STOP / Emit signal TO QRunnable - PullRequest
       71

STOP / Emit signal TO QRunnable

1 голос
/ 20 января 2020

Итак, у меня есть все oop внутри объекта qrunable, и я хочу остановить его из основного потока при нажатии на кнопку. я думаю, что понимаю поток: мне нужен var, который я не могу передать от main к qrunable объекту (thread) и проверить его как условие для каждой итерации. Я просто не могу понять, как это реализовать. вот что я получил:

class WorkerSignals(QObject):

finished = pyqtSignal()
error = pyqtSignal(tuple)
result = pyqtSignal(object)
live = pyqtSignal(bool)

class Worker(QRunnable):

def __init__(self, fn, *args, **kwargs):
    super(Worker, self).__init__()
    self.fn = fn
    self.args = args
    self.kwargs = kwargs
    self.signals = workerSignals.WorkerSignals()



@pyqtSlot()
def run(self):
    # self.fn(*self.args, **self.kwargs)
    try:
        result = self.fn(*self.args, **self.kwargs)
    except:
        traceback.print_exc()
        exctype, value = sys.exc_info()[:2]
        self.signals.error.emit((exctype, value, traceback.format_exc()))
    else:
        self.signals.result.emit("done")  # Return the result of the processing
    finally:
        self.signals.finished.emit()  # Done


class Main(QWidget):
def __init__(self):
    super().__init__()
    self.title = 'Test'
    self.setWindowTitle(self.title)
    self.active = False
    self.push_btn_start = QPushButton("Start")
    self.push_btn_stop = QPushButton("Stop")
    self.layout = QVBoxLayout()
    self.layout.addWidget(self.push_btn_start)
    self.layout.addWidget(self.push_btn_stop)
    self.setLayout(self.layout)
    self.msg = QMessageBox()
    self.push_btn_start.clicked.connect(self.do_something)
    self.threadpool = QThreadPool()
    self.showMaximized()

def do_something(self):

    self.worker = Worker(self.print_something)
    self.worker.signals.finished.connect(self.thread_complete)
    self.worker.signals.stop.connect(self.thread_stop)
    self.threadpool.start(self.worker)

def print_something(self):

    live = True
    while live:
        print("something...")

def thread_complete(self):
    print("THREAD COMPLETE!")
    QMessageBox.information(self,"Convert", "DONE")

def thread_stop(self):
    print()



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