Остановка работы воркера после остановки потока PyQT5 Python Qthread

Рейтинг: 0Ответов: 0Опубликовано: 10.02.2023

У меня есть небольшой графический интерфейс на PyQT5. Есть главное окно с таблицей и кнопкой "Считать". При нажатии на кнопку стартует дополнительный поток Qthread, куда методом moveToThread помещен воркер FillTableWorker. При нажатии на кнопку "Отмена" я останавливаю поток, но воркер продолжает работать и заполняет таблицу данными.

    def stop_reading_thread(self):
        
        self.table_thread.quit()

Так же я добавил в воркер флаг is_running, который устанавливаю в False, чтобы воркер прекратил цикл, но он все равно его продолжает, флаг не устанавливается.

self.fill_in_table_widget.stop()

Как мне по нажатию на кнопку из главного окна останавливать поток и завершать работу воркера?

Полный код:

class FillTableWorker(QtCore.QObject):
    running = True
    new_table_row = QtCore.pyqtSignal(int, object)
    exit_thread = QtCore.pyqtSignal(bool)

    def __init__(self):
        super().__init__()
        self.i = 0
        self.is_running = True

    def run(self):
        i = self.i
        self.total_events_count.emit(len(session.query(Event).all()))
        for event in session.query(Event).all():
            if self.is_running == True:
                list = [
                    QTableWidgetItem(str(i+1)),
                    QTableWidgetItem(str(event.date_time)),
                    QTableWidgetItem(str(event.bku)),
                    QTableWidgetItem(str(event.kl)),
                    QTableWidgetItem(str(event.au)),
                    QTableWidgetItem(str(event.channel)),
                    QTableWidgetItem(str(event.event_code)),
                    QTableWidgetItem(str(event.addit_param)),
                    QTableWidgetItem(str(event.description)),
                    QColor(codes_dictionary[event.event_code][1])
                ]
                self.new_table_row.emit(i, list)
                i += 1
        self.stop()
        self.exit_thread.emit(True)

    def stop(self):
        self.is_running == False


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # конфигурация главного окна и центрального виджета
        self.central_widget = QWidget(self)
        self.setGeometry(50, 50, 1500, 800)
        self.setWindowTitle('Чтение БКУ')

        self.table_thread = QtCore.QThread()
        self.fill_in_table_widget = FillTableWorker()
        self.fill_in_table_widget.moveToThread(self.table_thread)
        self.fill_in_table_widget.new_table_row.connect(self.add_row_in_table)

    @QtCore.pyqtSlot(bool)
    def stop_reading_thread(self):
        self.fill_in_table_widget.stop()
        self.table_thread.quit()

    @QtCore.pyqtSlot(int, object)   
    def add_row_in_table(self, i, list):
        print(list)


Ответы

Ответов пока нет.