gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:49:50 117 4
gpt4 key购买 nike

我正在尝试使用 PyQt 开发软件,但我经常在没有调试信息的情况下陷入软件崩溃(只有退出代码 0xC0000409)。我正在使用 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)

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

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

最佳答案

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)的错误消息。

关于python - 为什么 PyQt 在没有信息的情况下崩溃? (退出代码 0xC0000409),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46710299/

117 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com