QT/PySide processEvents调用锁定

2024-05-18 14:50:01 发布

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

为什么对processEvents的调用在长达9秒的时间内什么都不做?在

我有一个应用程序,它有一个基于PySide的QT接口,UI代码位于底层实际应用程序逻辑之上的解耦层。当用户执行一个执行可能会运行一段时间的低级应用程序逻辑的操作时,实际发生的情况是:

  1. 直接在GUI线程上显示一个进度对话框。在
  2. 直接在GUI线程上,低级逻辑启动一个工作线程。在
  3. 直接在GUI线程上,低级逻辑循环更新进度对话框(间接/解耦)并通过QtGui.qApp.processEvents()(再次间接/解耦)。在
  4. 在工作线程上,QT函数被调用(同样是间接/解耦)以响应事件,这些函数通过插槽/信号发生在GUI线程上,在GUI线程(如上所述)调用processEvents()时运行。在
  5. 直接在GUI线程上,在循环退出之前,最后一个processEvents()调用会阻塞大约9秒。这是在worker线程上的所有逻辑都结束并完成之后,没有更多的函数等待通过signal/slot调用在其上运行。此呼叫中没有与我的应用程序相关的内容。它在那里干什么?为什么会堵塞?我尝试过将最大处理时间传递给300ms,并查看它是否存在,但这没有任何区别。只要想锁定就锁定。在
  6. 进度对话框关闭,用户重新获得焦点。在

这一切都是分散在许多文件中,以一种解耦的方式实现的。我将尝试提供一些片段来描述流程。在

解耦的低级逻辑工作循环:

    while not completed_event.wait(0.1) and not work_state.is_cancelled():
        work_completeness, work_description = work_state.get_completeness(), work_state.get_description()
        for client in self.clients:
            if work_completeness != last_completeness or work_description != last_description:
                client.event_prolonged_action_update(client is acting_client, work_description, step_count * work_completeness)
            # THE LAST CALL TO THE NEXT LINE LOCKS UP FOR NO REASON
            client.event_tick(client is acting_client)
        last_completeness, last_description = work_completeness, work_description

PySide/QT层客户端事件触发函数:

^{pr2}$

在PySide/QT层中使用信号/插槽来获取GUI线程上发生的工作线程调用:

def event_pre_line_change(self, active_client, line0, line_count):
    self.pre_line_change_signal.emit((line0, line_count))

def event_post_line_change(self, active_client, line0, line_count):
    self.post_line_change_signal.emit((line0, line_count))

def event_uncertain_reference_modification(self, active_client, data_type_from, data_type_to, address, length):
    self.uncertain_reference_modification_signal.emit((data_type_from, data_type_to, address, length))

我之所以使用signals/slot将对worker线程的调用委托给GUI线程,是因为PySide/QT需要这样做,因为它们将更新UI。在

复制案例,如果你想深入挖掘:

  • 下载并根据GitHub项目自述文件运行the code。在
  • 从mega下载test file“NEURO”(大小为200KB)(抱歉,这是最容易上传到的网站)。在
  • 把NEURO装进皮索。在
  • 转到偏移量0x1A19E(CTRL-G)
  • 将数据类型更改为代码(菜单:编辑/更改地址数据类型/代码)
  • 观察进程对话框来来去去。在
  • 观察~9秒锁定。在

Tags: selfclienteventcountlineguidescription逻辑

热门问题