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

处理消息太慢,导致用户界面不稳定、无响应-如何使用多个线程来缓解这种情况?

  •  3
  • Shog9  · 技术社区  · 17 年前

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

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

    如果是这样,如何才能实现这一目标?

    如果没有,你能建议另一种方法来解决这个问题吗?

    3 回复  |  直到 9 年前
        1
  •  13
  •   Mark Ransom    17 年前

    不能有多个线程与消息泵或任何UI元素交互。那就是疯狂。

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

        2
  •  4
  •   Aaron Hall    9 年前

    如果这是以后的事情,我会说在 the yet to be released Visual Studio 2010 然而,我今天所说的工具是分离工作,特别是在消息传递泵中,您希望尽可能少地做一些工作来识别消息并将其传递给另一个将处理工作的线程(希望没有需要的线程本地信息)。将它传递给另一个线程意味着将它插入到某种类型的线程安全队列中,不管是锁定的还是无锁的,然后设置一个事件,其他线程可以监视该事件,以便从队列中提取项目(或直接提取项目)。为了提高效率,您可以考虑将“工作窃取队列”与线程池一起使用。

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

    如果你仍然看到不稳定的移动响应,另一个可以帮助你的技术是确保你的线程回调不会执行超过16毫秒的时间,并且你不会获取任何锁或者在UI线程上做任何类型的I/O。有一系列工具可以帮助识别这些操作,最自由可用的是 'windows performance toolkit' .

        3
  •  0
  •   eglasius    17 年前

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