【问题标题】:Effective Communication between Worker and UI ThreadsWorker 和 UI 线程之间的有效通信
【发布时间】:2011-12-02 01:17:28
【问题描述】:

我正在设计显示从多个传感器获取的图形或图像的实时 Windows 应用程序。我分配了一个线程来从每个传感器获取数据,并为每个显示器分配一个 UI 线程。根据 MSDN,我可以使用 PostThreadMessage 将消息发送到另一个线程。

听起来不错,但在我的架构中,工作线程需要发送大量信息,例如图像。所以我不认为我可以使用 PostThreadMessage 将单个大图像数据发送到 UI 线程,因为工作线程必须保存该数据,直到相应的 UI 线程处理它。

如果是这样,将大量数据从工作线程发送到 UI 线程的最佳方法是什么?

  1. 我曾考虑将其保存为文件,但我确信它可能会成为很大的瓶颈,因为它需要非常快速地处理数据。

  2. 当您从工作线程发送消息时,我的一个想法是发送非常小的部分,例如几行图像。

任何建议将不胜感激。

【问题讨论】:

  • 您不必发送所有数据。你有它在记忆中。你有一个指向它的指针。只需发送指针,然后同步访问。
  • @jeffamaphone 感谢您的意见。我知道我可以有一个指针并将其与消息一起发送。但是,从那时起,应该同步数据并且处理速度会变慢。我宁愿有异步进程,这样每个线程就不必等待太多。但这是我的想法。如果我错了,请指出。
  • @Paul:将图像内存的释放留给 ui 线程,并为工作线程中的下一个图像分配新内存。所以工作线程不必等到 ui-thread 处理完图像。需要更多内存,但无需复制或长时间等待。
  • @smerlin 感谢您的意见。好主意。

标签: multithreading


【解决方案1】:

我的评论作为答案: 正如 jeffamaphone 所写,使用指向内存的指针而不是复制所有内容。这就是线程的优势——共享内存——不要浪费它。 将图像内存的释放留给 ui 线程,并为工作线程中的下一个图像分配新内存。所以工作线程不必等到 ui-thread 处理完图像。需要更多内存,但无需复制或长时间等待。

有一些可能的改进,可以减少您必须进行的分配数量,但它们非常繁琐 - 并且它们确实会提高性能是非常值得怀疑的,因为它们会重新引入某种同步。所以我会按照我的建议继续实施它,如果你注意到内存分配量是性能瓶颈,你/我们可以重新考虑这个问题。

【讨论】:

  • 好吧,如果图像总是相同的大小,OP 可以在它们显示在 UI 线程上之后将“使用”的图像推送到生产者-消费者队列中。传感器输入线程/s 可以从这个队列中弹出图像,而不是 new/malloc 它们。这种优化移除了 malloc/free 并提供了流控制,同时仅在图像实例/指针从队列中推送/弹出时添加了一个简短的锁。仅当图像始终具有相同大小或可以位于某个缓冲区块的大小对图像数据“联合”的大小构成最大限制时才有帮助。
  • 感谢您的意见。现在,我将保留这个问题,以便在几天内获得更多意见。之后将接受答案。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 2016-06-07
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多