在使用pycharm写代码发现代码运行不了,进程已结束,退出代码为 -1073740791 (0xC0000409),但是又不提示具体错在哪。为了得到更加清晰的错误原因,可如下操作:
①点击debug旁边的三个小点more actions,点击编辑。
②勾选 在控制台中模拟终端。
此时我们能看到更多的报错信息,出现了原因QThread: Destroyed while thread is still running。这表明这个代码中试图销毁正在运行的线程。
随后对代码进行分析。
class TestThread(QThread):
def __init__(self, channel_index):
super().__init__()
self.channel_index = channel_index
def run(self):
# 线程的测试逻辑
logging.info(f"开始测试通道 {self.channel_index + 1}")
try:
# 在这里放置实际的测试代码,
result = utils.copy_check_audio()
logging.info(f"通道 {self.channel_index + 1} 测试完成")
except Exception as e:
logging.error(f"通道 {self.channel_index + 1} 测试失败: {e}")
class Window_Main(QMainWindow):
def main_test(self):
thread = TestThread(current_channel)
thread.start()
发现是我在main_tes函数中实例化的一个线程,而这个线程对象是一个局部变量,当main_test执行运行完成后,thread的引用计数器减一,此外代码中没有在别的地方引用该对象,因此此时引用计数器为0,触发python的垃圾回收机制,thread对象被回收,但是此时这个线程还在运行run中的代码,这才导致出现进程已结束,退出代码为 -1073740791 (0xC0000409)的错误。
解决方法
保留对线程的引用防止销毁:将线程对象存储在self.threads中,此时就是main_test执行完毕,这个对象仍然在被引用,python的垃圾回收机制就不会自动销毁他,这样当 thread.run()
完成后,线程会自己进入 finished 状态。
class TestThread(QThread):
def __init__(self, channel_index):
super().__init__()
self.channel_index = channel_index
def run(self):
# 线程的测试逻辑
logging.info(f"开始测试通道 {self.channel_index + 1}")
try:
# 在这里放置实际的测试代码,
result = utils.copy_check_audio()
logging.info(f"通道 {self.channel_index + 1} 测试完成")
except Exception as e:
logging.error(f"通道 {self.channel_index + 1} 测试失败: {e}")
class Window_Main(QMainWindow):
self.threads = []
def main_test(self):
thread = TestThread(current_channel)
self.threads.append(thread) #保留对线程的引用防止销毁
thread.start()
但是可以看到,这样也还有一个问题,当 thread.run()
完成后,线程会进入 finished 状态,但thread的引用计数器不为0,对象本身不会被自动销毁,当开的线程数越来越对,self.threads越来越大,占用系统资源,拖慢运行速度。因此需要手动移除对该线程的引用。最终改进后的代码如下:
class TestThread(QThread):
def __init__(self, channel_index):
super().__init__()
self.channel_index = channel_index
def run(self):
# 线程的测试逻辑
logging.info(f"开始测试通道 {self.channel_index + 1}")
try:
# 在这里放置实际的测试代码,
result = utils.copy_check_audio()
logging.info(f"通道 {self.channel_index + 1} 测试完成")
except Exception as e:
logging.error(f"通道 {self.channel_index + 1} 测试失败: {e}")
class Window_Main(QMainWindow):
self.threads = []
def main_test(self):
thread = TestThread(current_channel)
thread.finished.connect(self.on_thread_finished) # 当线程结束时调用
self.threads.append(thread) #保留对线程的引用防止销毁
thread.start()
def on_thread_finished(self):
# 清理已完成的线程
self.threads = [t for t in self.threads if t.isRunning()]
标签:index,thread,self,1073740791,running,线程,def,channel
From: https://blog.csdn.net/qq_46161199/article/details/142456137