由于QtCore4.dll,PyQt应用程序崩溃

时间:2015-09-07 23:56:55

标签: python thread-safety pyqt4

Pyqt App在一段时间后崩溃了。我最好的猜测是这是一个线程安全问题。

以下是错误代码:

    Problem signature:
Problem Event Name: APPCRASH
Application Name: python.exe
Application Version: 0.0.0.0
Application Timestamp: 53b1ee02
Fault Module Name: QtCore4.dll
Fault Module Version: 4.8.7.0
Fault Module Timestamp: 5566ccf4
Exception Code: c0000005
Exception Offset: 0000000000046f63
OS Version: 6.3.9600.2.0.0.272.7
Locale ID: 1033
Additional Information 1: 434d
Additional Information 2: 434d5893bd4d95749e45b6c395b12927
Additional Information 3: dd24
Additional Information 4: dd241847526058ce8cc7a34e073c1515

我将尝试发布窗口代码的简短版本:

class refreshTask(QtCore.QThread):

    def __init__(self, tableWidget):

        self.tableWidget = tableWidget
        QtCore.QThread.__init__(self)

    def run(self):

        while running:    
            try:
                self.conn = pymysql.connect(host=host,
                self.cur = self.conn.cursor()
                self.tableWidget.setRowCount(0)
                for result in results:

                    self.tableWidget.setRowCount(self.tableWidget.rowCount()+1)

                    self.cur.execute(sql, (result[0]))
                    entry = self.cur.fetchone()
                    self.emit(QtCore.SIGNAL('button ready'), result[0], entry[1], entry[2], str(result[1]),  i)
                    i += 1

            except :    
                self.tableWidget.setRowCount(0)

            time.sleep(5)


class Ui_MainWindow(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.conn = pymysql.connect(host=host,

        self.cur = self.conn.cursor()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(958, 587)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
        self.tableWidget = QtGui.QTableWidget(self.centralWidget)
        self.tableWidget.setGeometry(QtCore.QRect(100, 110, 800, 401))
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(5)
        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))

        self.tableWidget.horizontalHeader().setCascadingSectionResizes(False)
        self.tableWidget.horizontalHeader().setMinimumSectionSize(50)
        self.tableWidget.verticalHeader().setDefaultSectionSize(50)
        self.tableWidget.setColumnWidth(0, 175)
        self.tableWidget.setColumnWidth(1, 175)
        self.tableWidget.setColumnWidth(2, 175)
        self.tableWidget.setColumnWidth(3, 175)
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.setHorizontalHeaderLabels(['username', 'IP Address', 'Port Number', 'Latest heartbeat', 'open gate'])
        self.label = QtGui.QLabel(self.centralWidget)
        self.label.setGeometry(QtCore.QRect(40, 40, 161, 31))
        self.label.setObjectName(_fromUtf8("label"))
        MainWindow.setCentralWidget(self.centralWidget)    
        self.refresher = refreshTask(self.tableWidget)
        self.refresher.start()
        self.connect(self.refresher, QtCore.SIGNAL("button ready"), self.funct)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):    
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.label.setText(_translate("MainWindow", "Server Status :", None))
    def funct(self, username, ip, port, hearbeat, i):

        item = QtGui.QTableWidgetItem(username)
        self.tableWidget.setItem(i, 0, item)
        item = QtGui.QTableWidgetItem(ip)
        self.tableWidget.setItem(i, 1, item)
        item = QtGui.QTableWidgetItem(port)
        self.tableWidget.setItem(i, 2, item)
        item = QtGui.QTableWidgetItem(str(hearbeat))
        self.tableWidget.setItem(i, 3, item)
        btn = QtGui.QPushButton(self.tableWidget)
        btn.setText('Open gate\n'+username)
        btn.clicked.connect(self.buttonClicked)
        self.tableWidget.setCellWidget(i, 4, btn)

    def buttonClicked(self):
        sender = self.sender()
        liste = sender.text()
        print liste + " was pressed"



def myExitHandler():

    global running
    running = False

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    app.aboutToQuit.connect(myExitHandler)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()    
    sys.exit(app.exec_())

我有点迷失在这里,不知道从哪里开始。 GUI执行一个简单的任务,从SQL数据库中提取列表并将其插入到一个小部件列表中,此任务每5秒重复一次。

0 个答案:

没有答案