我想写一个用于刷新数据库数据载入进度的组件, 进度条是能跑的, 但是跑完就会异常退出. 不论是继承Qthread还是Qrunnable我都试了一遍, 一直找不到原因, 最终定位到是数据库数据库查询的问题, 报错就很简单"Process finished with exit code -1073741819 (0xC0000005)"

代码如下:

import sys

import datetime
from peewee import ModelSelect
from vnpy.trader.database import get_database
from vnpy.trader.ui import QtCore, QtWidgets, create_qapp
from vnpy_sqlite.sqlite_database import DbBarData


class WorkSignal(QtCore.QObject):
    signal_progress = QtCore.pyqtSignal(int)


class WorkerThread(QtCore.QRunnable):
    def __init__(self):
        super().__init__()
        self.signal = WorkSignal()
        self.progress_value = 0
        self.database = get_database()

    @QtCore.Slot()
    def run(self) -> None:
        self.s_database()

    def s_database(self):
        start = datetime.datetime(2018, 7, 1)
        end = datetime.datetime(2020, 8, 1)
        s: ModelSelect = DbBarData.select().where(
            (DbBarData.symbol == "IF99")
            & (DbBarData.exchange == "CFFEX")
            & (DbBarData.interval == "1m")
            & (DbBarData.datetime >= start)
            & (DbBarData.datetime <= end)
        ).order_by(DbBarData.datetime)

        for db_bar in s:
            self.progress_value += 1
            self.signal.signal_progress.emit(self.progress_value)


class Mainw(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.pool = QtCore.QThreadPool()
        self.btn = QtWidgets.QPushButton("点击")
        self.btn.clicked.connect(self.start_thread)
        self.thread_ = WorkerThread()
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.btn)
        self.progress_bar = QtWidgets.QProgressBar(self)
        self.progress_bar.setMaximum(100000)
        self.thread_.signal.signal_progress.connect(self.progress_bar.setValue)

        layout.addWidget(self.progress_bar)
        self.setLayout(layout)

    def start_thread(self):
        self.pool.start(self.thread_)


if __name__ == "__main__":
    app = create_qapp()
    window_ = Mainw()
    window_.show()

    sys.exit(app.exec())

description