MFC应用程序在事件泛滥时能够做出响应

时间:2010-02-22 20:29:26

标签: mfc

我有一个传统的C ++,MFC应用程序,目前正在VS2005中编译。

它有几个套接字连接,以及用户GUI。

套接字在非MFC线程中终止,一些工作在这些后台线程中完成,然后将消息发布到MFC主队列,以便主应用程序可以注意并执行适当的操作。请注意,每个套接字接收消息都会向主线程发布一条消息。

主线程操作通常每次只需要几分之一秒。

但是,如果我收到消息 flood ,则GUI可能会变得迟缓甚至无响应一段时间,因为主线程忙于执行集成 - 新数据任务而不是回应用户。

如果我能够清楚地表达我的问题:对解决方案的任何建议,以便GUI在面对大量这些事件时仍保持响应?

4 个答案:

答案 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很快 - 即使感知这么多,您需要将数据汇总成易于理解的几个部分,并避免覆盖任何现有文本,因此它不会变成一种难以理解的模糊。