代码之家  ›  专栏  ›  技术社区  ›  SLaks

等待waithandle时运行消息循环

  •  3
  • SLaks  · 技术社区  · 16 年前

    当UI线程在等待waithandle或其他线程原语时,是否有任何方法处理所有Windows消息?

    我意识到它会造成非常混乱的重入问题;我无论如何都想这样做。

    编辑 :等待发生在必须在UI线程上运行的复杂函数的中间。因此,将等待移动到后台线程不是一个选项。(将函数分为两部分会造成复杂且无法修复的混乱)

    4 回复  |  直到 16 年前
        1
  •  4
  •   tofi9    16 年前

    我将在一个单独的后台线程中运行整个“不能拆分的复杂函数”,并让它仅在需要时(在控件上使用invoke/begininvoke方法)向GUI报告。

    在更增强的版本中,您应该在一个不依赖于UI的非UI控制器中运行复杂的函数,并且更容易进行单元测试。调用回UI并在UI中显示结果,可以通过让UI子标记控制器提供的事件来轻松访问。

        2
  •  3
  •   DarkSquid    16 年前

    为什么不生成另一个线程来执行等待,并让他在适当的接合点通过消息(或其他)通知UI线程?

    这是通常允许在阻塞事件期间处理UI线程消息的方法。

    编辑: 现在我明白了——您已经在UI代码中构建了应用程序逻辑逻辑。那么,这真的是一个设计问题。从长远来看,您最好将该功能从UI分解为一个独立的对象,并使用某种机制与工作人员的UI通信状态。

    除了让您的UI代码集中在UI上的好处之外,这还允许您分别对逻辑代码进行单元测试。

        3
  •  2
  •   Remy Lebeau    16 年前

    不确定C,但在普通的win32编程中,您可以使用msgwaitfor…()函数之一进行实际等待。当消息出现在消息队列中时,以及等待的对象发出信号时,它将通知您。如果报告存在消息,可以调用getMessage()、translateMessage()和dispatchMessage()来处理消息,然后返回等待状态。

        4
  •  2
  •   Reed Copsey    16 年前

    我通常会建议把你的等待条件放到另一个线程上。

    不过,尽管如此,你可以随时打电话给 Application.DoEvents 在任何点处理消息泵,包括等待句柄上的“等待”期间(仅超时、执行事件、等待超时等,直到“通过”等待句柄)。