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
相关产品推荐
相关产品推荐

