我想写一个用于刷新数据库数据载入进度的组件, 进度条是能跑的, 但是跑完就会异常退出. 不论是继承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())