我有一个传统的C ++,MFC应用程序,目前正在VS2005中编译。
它有几个套接字连接,以及用户GUI。
套接字在非MFC线程中终止,一些工作在这些后台线程中完成,然后将消息发布到MFC主队列,以便主应用程序可以注意并执行适当的操作。请注意,每个套接字接收消息都会向主线程发布一条消息。
主线程操作通常每次只需要几分之一秒。
但是,如果我收到消息 flood ,则GUI可能会变得迟缓甚至无响应一段时间,因为主线程忙于执行集成 - 新数据任务而不是回应用户。
如果我能够清楚地表达我的问题:对解决方案的任何建议,以便GUI在面对大量这些事件时仍保持响应?
答案 0 :(得分:2)
如果您希望GUI完全优先于套接字工作,可以使用CWinApp::OnIdle检查要在套接字上完成的工作。
答案 1 :(得分:1)
我自己的答案 - 不要太过刻苦! :)
想法是将每条消息的单消息发布到主线程分解为更破碎的模型。
如果我有三个后台侦听线程,那么我应该有三个后台队列,与主MFC事件队列分开。当我收到的东西,我发布到主MFC线程;并在特定的后台队列中排队。
当MFC主线程执行该特定事件时,我可以在适当的后台队列中对部分或全部收到的消息进行操作,如果我没有完全耗尽队列,那么我只是将消息重新发送给MFC主线程确保我会再次醒来完成这项工作。
这确保了GUI事件将以适当的速率被抽取,即使在从各种后台线程收到高其他消息速率的情况下也是如此。
答案 2 :(得分:1)
您可以分析GUI /主线程中调用的代码吗?您确定需要在主/ GUI线程中进行处理吗?如果可能的话,将该工作卸载到另一个线程或调整正在进行的工作。
答案 3 :(得分:1)
在面对大量事件时,您不必试图保持GUI响应,而是需要确保它首先不会发生如此大量的事件。
在典型的计算机上,屏幕仅以60 FPS重新绘制,因此没有什么比这更快可以有意义。对于一个用户来说,即使是60 FPS也只对电影的顺序有用。
对于典型的数据更新,10 FPS很快 - 即使感知这么多,您需要将数据汇总成易于理解的几个部分,并避免覆盖任何现有文本,因此它不会变成一种难以理解的模糊。