как закрыть работающий поток после создания нового - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать тикер цен, который обновляется каждые 2 секунды.

как отменить предыдущий поток после создания нового (новый создается после вызова run_worker ())

Я пытался как-то получить доступ к self._flag извне, чтобы закрыть поток, но как получить доступ к текущему и закрыть его?

def run_worker(self):
    print("run_worker")
    symbol = str(self.ui.pair_combo.currentText())
    worker = Worker(self.execute_this_fn, symbol)
    worker.signals.result.connect(self.print_output)
    worker.signals.finished.connect(self.thread_complete)
    self.threadpool.start(worker)

class WorkerSignals(QObject):
    finished = pyqtSignal()
    error = pyqtSignal(tuple)
    result = pyqtSignal(object)


class Worker(QRunnable):
    def __init__(self, fn, *argv, **kwargs):
        super(Worker, self).__init__()
        self.fn = fn
        self.argv = argv
        self.kwargs = kwargs
        self.signals = WorkerSignals()

        self.c = Client(api_key="account-xxx", api_secret="xxx", sandbox=True)

    @pyqtSlot()
    def run(self):
        asset = self.argv[0]
        self._flag = True
        try:
            while self._flag:
                # The price of the LAST executed trade on the exchange
                result = list(self.c.get_ticker(asset).values())[3]
                print("result " + result)
                time.sleep(2)
                if not self._flag:
                    break
            else:
                self._flag = False
        except:
            traceback.print_exc()
            exctype, value = sys.exc_info()[:2]
            self.signals.error.emit((exctype, value, traceback.format_exc()))
        else:
            self.signals.result.emit(result) # Return the result of the processing
        finally:
            self.signals.finished.emit() #done

каждый раз, когда вызывается функция run_worker (в зависимости от currentText в поле со списком), создается новый поток.

...