【发布时间】:2018-03-24 10:22:13
【问题描述】:
我正在尝试使用 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)
当我在run() 或ConnDisconn() 中读/写serialEnabled 时发生崩溃。我知道 PyQt 不是线程安全的,并且对变量的错误处理会导致我的类型崩溃,但我不明白我的代码有什么问题。我的想法(可能是错误的)是所有serialThread 方法都在同一个线程上执行,即使它们连接到 gui(主线程)也是如此。那是错的吗?同样,我从 serialThread 发出事件并将它们连接到 GUI,但这从来没有给我带来问题。
你能看出我犯的错误吗?如果在没有其他信息的情况下发生崩溃,有没有办法调试代码? (我使用 PyCharm 2017.1.3)。
【问题讨论】:
-
你试过从终端运行吗?
-
这是真的!在终端我有崩溃的原因:|而且我浪费了大约 8 个小时来调试没有信息的代码......在那种情况下,python 似乎无法理解我对两个类似函数 updatePB(self,stat)和 updatePB(self)所做的重载,因为我给了 2 个参数而哭泣当我调用它时,而不是 1。
-
谢谢@eyllanesc!我试图使用 PyCharm 的运行/调试配置运行代码,但只得到错误代码。
标签: python multithreading pyqt thread-safety qthread