3

我无法让我的应用程序响应用户操作。因此,我想在多个线程之间拆分消息处理。

我可以简单地创建几个线程,从所有线程中的同一个消息队列中读取,并让哪个线程能够处理每条消息吗?

如果是这样,如何实现?

如果没有,您能否提出另一种解决此问题的方法?

4

3 回答 3

13

与消息泵或任何 UI 元素交互的线程不能超过一个。那就是疯狂。

如果有很长的处理任务可以外包给工作线程,您可以这样做,但您必须使用另一个线程安全队列来管理它们。

于 2009-04-23T19:04:37.073 回答
4

如果这是在未来的晚些时候,我会说在尚未发布的 Visual Studio 2010中使用异步代理 API(我正在处理的插件) 但是我会说鉴于今天的工具是分开工作,特别是在您的消息传递泵中,您希望尽可能少地识别消息并将其传递给另一个线程,该线程将处理该工作(希望不需要线程本地信息)。将它传递给另一个线程意味着将其插入某种锁定或无锁的线程安全队列,然后设置一个其他线程可以观察的事件以从队列中拉取项目(或直接拉取它们)。您可以考虑使用带有线程池的“工作窃取队列”来提高效率。

这将完成从 UI 线程中获取工作,让 UI 线程执行额外的工作(例如绘制该工作的结果),您需要生成一条 Windows 消息来唤醒 UI 线程并检查结果,这是一种简单的方法这样做是让另一个工作对象的“工作就绪”队列在 UI 线程上执行。想象一个看起来像这样的队列:threadsafe_queue<function<void(void)> 基本上你可以检查它是否在 UI 线程上是非空的,如果有工作项,那么你可以内联执行它们。您会希望工作对象的寿命尽可能短,并且最好根本不做任何阻塞。

如果您仍然看到不稳定的运动响应,另一种可以提供帮助的技术是确保您的线程回调没有执行超过 16 毫秒,并且您没有在 UI 上使用任何锁或执行任何类型的 I/O线。有一系列工具可以帮助识别这些操作,最免费可用的是“windows 性能工具包”

于 2009-04-23T19:15:19.247 回答
0

在处理长操作时创建单独的线程,即保持简单,问题在于您正在运行的某些代码花费了太长时间,这就是应该具有单独线程的代码。

于 2009-04-23T19:02:56.470 回答