2009-06-03 26 views
3

当UI线程在WaitHandle或其他线程原语上等待时,是否有任何方法来处理所有Windows消息?在等待WaitHandle时运行消息循环

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

EDIT:等待发生在必须在UI线程上运行的复杂函数中。因此,将等待移动到后台线程不是一种选择。 (将函数分成两部分会造成复杂且不可维护的混乱)

回答

4

我会在一个单独的后台线程中运行整个“不可拆分的复杂功能”,并仅在需要时才向GUI报告(使用Invoke/BeginInvoke方法在控制上)。

在更加强化的版本中,您应该在不依赖于UI的非UI控制器中运行复杂功能,并且更容易进行单元测试。回调UI并在UI中显示结果,可以通过让UI来描述控制器提供的事件来轻松实现。

3

为什么不只是产生另一个线程来执行等待并让他通过消息(或其他)在适当的时刻通知UI线程?

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

编辑: 我现在看到 - 你已经在UI代码中内置了应用逻辑逻辑。那么,这真是一个设计问题。从长远来看,你最好从UI中将这些功能分解为一个独立的对象,并使用一些机制与工作人员的UI交流状态。

除了保持您的UI代码专注于UI的好处之外,这允许您单独测试逻辑代码。

+1

+1,在UI线程上等待并不酷。使用回调。 – 2009-06-03 19:43:29

+0

因为我正在等待一个必须在UI线程上运行的函数(绑定到UI的非线程安全数据对象),并且我不想分割它并保存局部变量。 – SLaks 2009-06-03 19:47:05

2

不确定C#,但在普通的Win32编程中,您可以使用其中一个MsgWaitFor ...()函数进行实际等待。当消息出现在消息队列中时,它会通知你,以及当等待的对象变成信号时。如果报告存在消息,则可以调用GetMessage(),TranslateMessage()和DispatchMessage()来处理消息,然后再返回等待状态。

2

我通常会建议把你的等待条件放在另一个线程上。但是,也就是说,你总是可以在任何时候调用Application.DoEvents来处理消息泵,包括在“等待”等待句柄(只是超时,执行事件,等待超时等等,直到你得到“通过“等待处理”)。