Multithreading 工作线程和UI线程之间的有效通信

Multithreading 工作线程和UI线程之间的有效通信,multithreading,Multithreading,我正在设计实时windows应用程序,显示从多个传感器获取的图形或图像。我为每个传感器分配了一个线程来获取数据,为每个显示器分配了一个UI线程。根据MSDN,我可以使用PostThreadMessage向另一个线程发送消息 这听起来不错,但在我的体系结构中,工作线程需要发送大量信息,例如图像。因此,我不认为我可以使用PostThreadMessage将单个大图像数据发送到UI线程,因为工作线程必须保存该数据,直到相应的UI线程处理它 如果是这样,将大量数据从工作线程发送到UI线程的最佳方式是什么

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

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

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

  • 我曾考虑将其保存为文件,但我确信这可能是一个很大的瓶颈,因为它需要非常快速地处理数据

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

  • 如果您有任何建议,我们将不胜感激。

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


    有一些可能的改进,可以减少您必须进行的分配的数量,但是这些改进非常复杂,而且它们确实会提高性能,这是非常令人倍感困惑的,因为它们会重新引入某种同步。因此,我会按照我的建议继续实施,如果您注意到内存分配量是一个性能瓶颈,您/我们可以重新考虑这个问题。

    您不必发送所有数据。你已经记住了。你有一个指向它的指针。只需发送指针,然后同步访问即可。@jeffamaphone感谢您的输入。我知道我可以有一个指针并将其与消息一起发送。然而,从那时起,数据应该同步,处理速度会减慢。我宁愿使用异步进程,这样每个线程就不必等待太多时间。但那是我的主意。如果我错了,请指出。@Paul:将图像内存的释放留给ui线程,并为工作线程中的下一个图像分配新内存。因此,工作线程不必等待ui线程完成图像处理。需要更多内存,但无需复制或长时间等待。@smerlin感谢您的输入。好主意。好吧,如果图像总是相同的大小,OP可以将“使用过的”图像在UI线程上显示后推送到生产者-消费者队列中。传感器输入线程可以从此队列中弹出图像,而不是新建/删除它们。此优化删除malloc/free并提供流控制,同时仅在从队列中推送/弹出映像实例/指针时添加一个简短的锁。仅当图像大小始终相同或可以位于某个缓冲块上时才有帮助,该缓冲块的大小对图像数据“union”的大小形成最大限制。谢谢您的想法。现在,我将把这个问题留待几天,以便获得更多的信息。然后我会接受答案。再次感谢。