You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt应用运行数小时后静默崩溃问题排查求助

PyQt多线程更新表格视图崩溃排查求助

我花了一周调试一个大型PyQt项目,已缩小崩溃范围。项目包含QMainWindow和一个永久运行的工作线程,线程从互联网获取处理数据后,发送信号给主线程槽函数更新表格视图。

崩溃前输出

This function's name is:check {'type': 'DISPO OCP', 'nom': 'AVAMYS 27,5 microgrammes/pulvérisation, suspension pour pulvérisation nasale', 'cip13': '3400938322446', 'quantité': 'N/A'}
start of slot
received :
end of slot
requete ocp n°1398
requete ocp n°1399
requete ocp n°1400
QThread: Destroyed while thread is still running

相关代码

MainWindowWrapper类定义

class MainWindowWrapper(Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self) -> None:
        super().__init__()
        self.setupUi(self)
        self.Set_Table_View()

表格视图设置函数

def Set_Table_View(self):
    self.model_table_view = QtGui.QStandardItemModel()
    self.model_table_view.setHorizontalHeaderLabels(['Type', 'Nom', 'CIP 13', 'Quantité', "Horodatage"])
    #Setup middle filter
    self.proxyModel_combobox = QSortFilterProxyModel()
    self.proxyModel_combobox.setSourceModel(self.model_table_view)
    self.proxyModel_combobox.setFilterKeyColumn(0)
    #setup filter
    self.Table_proxyModel = MultiColumnFilterProxyModel()
    self.Table_proxyModel.setSourceModel(self.proxyModel_combobox)
    self.Table_proxyModel.setFilterKeyColumn(0)
    self.tableView.setModel(self.Table_proxyModel)
    #set largeurs colonnes
    self.tableView.setColumnWidth(0, 90)
    self.tableView.setColumnWidth(1, 350)
    self.tableView.setColumnWidth(2, 90)
    self.tableView.setColumnWidth(3, 50)
    self.tableView.setColumnWidth(4, 150)

工作线程启动代码

def HandleBot(self):
    self.lock = threading.Lock()
    self.bot_instance = Bot(self.lock)
    self.thread_handle = QThread(parent = self)
    self.bot_instance.moveToThread(self.thread_handle)
    self.bot_instance.log_text_signal.connect(self.add_text_to_plaintext)
    self.thread_handle.started.connect(self.bot_instance.call_check)
    self.thread_handle.start()
    return

槽函数定义

@QtCore.pyqtSlot(int, int, int, int)
def add_text_to_plaintext(self, int, int2, int3, int4):
    print("start of slot")
    debg = "received : " 
    print(debg)
    item_list = [QtGui.QStandardItem(str(int)), QtGui.QStandardItem(str(int2)), 
                 QtGui.QStandardItem(str(int3)), QtGui.QStandardItem(str(int4)),
                 QtGui.QStandardItem(str(datetime.datetime.now().replace(microsecond=0)))]
    self.model_table_view.appendRow(item_list)
    print("end of slot")

Bot类定义

class Bot(QObject):
    log_text_signal = pyqtSignal(int, int, int, int)
    def __init__(self, lock : threading.Lock):
        super().__init__()
        self.lock = lock
        self.keep_bot_running = True
        self.numberExec = 0
        return
def call_check(self):
    pydevd.settrace(suspend=False)
    While True:
        .....do stuff....
        self.numberExec += 1
        print('requete ocp n°' + str(self.numberExec))
        debg = "This function's name is:" + self.current_function_name() + " " + str(info)
        print(debg)
        with self.lock:
        self.log_text_signal.emit(1, 0, 0, 0)

已尝试操作

将槽函数中的item_list替换为item_list = QtGui.QStandardItem()后,应用不再崩溃,但表格视图会添加空行。此前怀疑线程间信号槽处理有误,但未找到问题根源,恳请提供排查线索。

内容的提问来源于stack exchange,提问作者user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:37:44