两个线程(套接字线程和主线程)之间最有效的内部通信是什么



我们确实有一个线程通过使用WSARecvFrom()和IoCompletionPort的异步IO从多个套接字读取数据。

接收到的数据(数据包大小约为1500字节)应由主线程处理。主线程还处理所有其他同步内容。

如果主线程与一个窗口相关联,并且我们使用PostMessage()向该窗口发送消息,那么它将花费大量时间,直到主窗口线程通过GetMessage()获得消息并能够处理数据。如果我们要处理大量的网络消息,这种方法是不可用的。

套接字线程中的PostThreadMessage()和主线程中的GetMessage()会有更好的性能吗?

套接字线程中的SetEvent()和主线程中的WaitForMultipleObjects()会有更好的性能吗?

有没有一种更有效的方式来向主线程发送数据到达的信号?

是否有任何Win32同步函数也可以直接发送要由主线程处理的数据,而不需要信号量保护应用程序缓冲区?

本质上没有。没有比PostMessage()、PostThreadMessage()和QueueUserAPC等线程间命令调用更快的机制了。

此类调用传输缓冲区指针或"this"实例指针所花费的时间通常会被将此类数据呈现到GUI组件上所需的大量时间所淹没。

如果您在主线程中加载了一堆非GUI活动,这些活动阻止了消息的提示处理,或者您发布消息的速度超过了GUI线程合理使用消息的速度,那么您就遇到了一个大问题。

如果PostMessage()的延迟实际上是问题的根本原因(我对此表示怀疑),那么您可以将缓冲区聚合到一个容器对象和PostMessage中,从而提高已发布消息的整体带宽。

套接字线程中的SetEvent()和中的WaitForMultipleObjects()主线程有更好的性能吗?

我怀疑不是很明显。它必须是WaitForMultipleObjects(Ex),以处理"正常"的GUI消息以及您的东西。如果根本原因是主线程由于其他原因过载,或者消息发布的速度超过了您的处理速度,那么这将没有帮助。

相关内容

最新更新