为什么PyQt在没有信息的情况下崩溃?(出口代码0xC0000409)

2024-10-05 10:03:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用PyQt开发一个软件,但是我经常在没有调试信息的情况下陷入软件崩溃(只有退出代码0xc000409)。我正在使用QThread,我编写了这样一个系统:

class serialThreadC(QThread):
    updateOutBox = QtCore.pyqtSignal(str)
    updateStatus = QtCore.pyqtSignal(int)

    def __init__(self):
        super(serialThreadC, self).__init__()
        self.ser = False
        self.state = 0
        self.serialEnabled = False

    def run(self):
        while True:
            if self.state == -3 or self.state == -2:
                if self.SerialEnabled:
                    self.updatePB(20)
            elif self.state == 0:
                if self.serialEnabled:
                    self.updatePB(20)

    def ConnDisconn(self):
        self.serialEnabled = not self.serialEnabled

    def updatePB(self, stat):
        self.state = stat
        self.updateStatus.emit(self.state)

serialThread = serialThreadC()
serialThread.start()

## sw is a QDialog already loaded
serialThread.updateOutBox.connect(sw.updateOutBox)
serialThread.updateStatus.connect(sw.updateStatus)

sw.PB_ConnDisconn.clicked.connect(serialThread.ConnDisconn)

当我在run()ConnDisconn()中读/写serialEnabled时发生崩溃。我知道PyQt不是线程安全的,对变量的错误处理会导致我的类型崩溃,但是我无法理解我的代码有什么问题。我的想法(可能是错误的)是,所有的serialThread方法都在同一个线程上执行,如果它们连接到一个gui(主线程)。是不是错了?以同样的方式,我从serialThread发出事件并将它们连接到GUI,但这从来没有给我带来问题。

你能看到我犯的错误吗?如果在没有其他信息的情况下发生崩溃,是否有方法调试代码?(我使用PyCharm 2017.1.3)。


Tags: 代码selfifdefconnectswpyqtstate
1条回答
网友
1楼 · 发布于 2024-10-05 10:03:33

PyQt是线程安全的,与Qt是线程安全的程度相同。Qt文档将告诉您他们的API的哪些部分可以保证是这样的,以及在什么情况下。

跨线程信号是线程安全的,因此在示例中调用updatePB方法是可以的。您的ConnDisconn方法不是线程安全的,但这与PyQt或Qt无关-这只是您如何编写它的结果。serialEnabled属性可以由两个线程同时读/写,因此行为是严格未定义的。一种线程安全的方法是使用mutex,如下所示:

class serialThreadC(QThread):
    updateOutBox = QtCore.pyqtSignal(str)
    updateStatus = QtCore.pyqtSignal(int)

    def __init__(self):
        super(serialThreadC, self).__init__()
        self.ser = False
        self.state = 0
        self._mutex = QMutex()
        self.serialEnabled = False   

    def ConnDisconn(self):
        self._mutex.lock()
        self.serialEnabled = not self.serialEnabled
        self._mutex.unlock()

    def run(self):
        while True:
            if self.state == -3 or self.state == -2:
                self._mutex.lock()
                if self.serialEnabled:
                    self.updatePB(20)
                self._mutex.unlock()
            elif self.state == 0:
                self._mutex.lock()
                if self.serialEnabled:
                    self.updatePB(20)
                self._mutex.unlock()

(注意:如果您正在使用任何类型的IDE或调试器,并且遇到意外的错误或崩溃,诊断问题的第一步应该始终是在标准控制台中测试代码。通常,IDE或调试器本身可能是问题的原因,或者可能屏蔽来自Python或来自底层库(如Qt)的错误消息。

相关问题 更多 >

    热门问题