# # 多线程实例3 method = [pieState] # 字典 self.thread_s1 = {} self.worker_s1 = {} for i in range(len(method)): self.thread_s1[i] = 'thread' + str(i) self.worker_s1[i] = 'worker' + str(i) try: for j in range(len(method)): self.thread_s1[j] = QThread() self.worker_s1[j] = Worker() self.worker_s1[j].moveToThread(self.thread_s1[j]) self.thread_s1[j].started.connect(self.worker_s1[j].run) self.worker_s1[j].finished.connect(self.thread_s1[j].quit) self.worker_s1[j].finished.connect(self.worker_s1[j].deleteLater) self.thread_s1[j].finished.connect(self.thread_s1[j].deleteLater) self.worker_s1[j].finished.connect(method[j]) # Start the thread self.thread_s1[j].start() except Exception as alarm: print(str(alarm))子线程运行报警为什么没有触发try except
时间: 2024-02-14 18:19:19 浏览: 24
根据您提供的修改后的代码,可以看出您已经在try语句块中包含了整个for循环。因此,如果有任何异常在for循环中抛出,都应该被try语句块捕获并触发except语句块中的代码。如果您仍然没有触发try except机制,可能是因为您没有正确地引发异常。您可以尝试在for循环中添加一些故意触发异常的代码来测试try except机制是否正常工作。
相关问题
def __init__(self, width, height, route_list): self.width = width self.height = height self.route_list = route_list self.video_list = [] self.thread_pool = ThreadHelper.thread_pool self.do_work = None self.cache_output = [] self.cache_worker_name = [] self.video_writer_list = [] self.qt_is_show = False self.cur_page = 0 self.init_worker_and_video() self.srs_close_draw_index = -1 self.face_library = DBManager.get_instance().get_all_face() self.face_work = None self.face_model_name = "rockface-data" # self.init_frpc_open_status()
这是一个名为 HelmetManager 的类的构造函数,它接受三个参数:width、height 和 route_list。其中,width 和 height 分别表示窗口的宽和高,route_list 是一个列表,用于存储数据路径。
在函数中,首先将这三个参数赋值给类的属性。然后,初始化了一些其他属性,例如 video_list、thread_pool、cache_output、cache_worker_name、video_writer_list、qt_is_show 等等。其中,video_list 是存储视频的列表,thread_pool 是线程池,cache_output 和 cache_worker_name 是缓存的输出和工作名称,video_writer_list 是存储视频写入器的列表,qt_is_show 表示 QT 是否显示,cur_page 是当前页面,init_worker_and_video() 是初始化工作和视频。
接下来,初始化了一些人脸相关的属性。其中,face_library 是获取所有人脸的数据库实例,face_work 代表人脸工作,face_model_name 是 RockFace 模型的名称。
最后,注释掉了一行代码,该代码是用于初始化 frpc 状态的。
# # 多线程实例3 method = [RTYtrend,OTDTrend,DDHTrend,PROTrend,Show_s,Show_q,Show_d,Show_i,Show_p,Show_allongoing,Show_status, s_daily,q_daily,d_daily,i_daily,p_daily] #字典 thread = [] worker = [] for i in range(len(method)): thread.append('thread' + str(i)) worker.append('worker' + str(i)) print(worker) for j in range(len(method)): self.thread[j] = QThread() self.worker[j] = Worker() self.worker[j].moveToThread(self.thread[j]) self.thread[j].started.connect(self.worker[j].run) self.worker[j].finished.connect(self.thread[j].quit) self.worker[j].finished.connect(self.worker[j].deleteLater) self.thread[j].finished.connect(self.thread[j].deleteLater) #self.worker[j].finished.connect(lambda j=j: method[j]()) # Start the thread self.thread[j].start()报警:status'builtin_function_or_method' object does not support item assignment怎么解决?
这个报警的原因是你在使用 `self.thread[j]` 和 `self.worker[j]` 时,将它们定义为列表,但是在下面的代码中,你又将它们分别赋值为 QThread 和 Worker 类的实例。所以在 `self.thread[j] = QThread()` 和 `self.worker[j] = Worker()` 的语句中,你试图将列表中的元素替换为 QThread 和 Worker 类的实例,但是 Python 中函数和方法是不支持赋值的,所以报出了该错误。
要解决这个问题,你可以将 `self.thread` 和 `self.worker` 定义为字典而不是列表,这样就可以通过键名来引用对应的 QThread 和 Worker 实例了。具体来说,你可以将 `thread = []` 和 `worker = []` 改为 `self.thread = {}` 和 `self.worker = {}`,然后将 `self.thread[j]` 和 `self.worker[j]` 改为 `self.thread[thread[j]]` 和 `self.worker[worker[j]]` 即可。