不是从易用性,而是从性能的角度来看。 MFC消息映射比典型的消息泵更快吗?
答案 0 :(得分:6)
MFC包装Win32消息传递,所以如果有什么,MFC会稍微慢一些。也就是说,如果你正在处理UI小部件,性能不是一个问题。
答案 1 :(得分:6)
它们不可能更快,因为它们只是普通Windows消息泵的包装器。话虽如此,它们对反射消息和自定义控件的消息泵封装有很大帮助,而且开销可以忽略不计,所以如果你有一个复杂的UI项目,从长远来看它是值得的。
答案 2 :(得分:4)
我不得不同意(迄今为止)其他2位声称MFC消息泵性能较差的受访者,因为它包含普通的旧C消息泵:MFC使用的技术与包含巨型的简单窗口过程完全不同切换(消息)声明。
MFC消息泵确实依赖于Win32消息循环(必须)。但是实现是非常不同的:基于钩子,调度由MFC内部处理的消息而不是依赖于DispatchMessage()API。
MFC使用map将消息与处理程序进行匹配:O(log n)。从这个角度来看,可能会出现这种情况比大型严重编译的switch(消息)语句更快的情况:O(n)。
此外,识别正确的窗口对象可能比DispatchMessage()更快,我们无法确定这是因为Windows不是开源的。
然而,这是不可能的,特别是考虑额外的代码,例如命令路由,空闲处理和MFC代码处理的各种极端情况......以及编译器足够聪明以有效实现大{{}的事实。 1}}陈述!
话虽如此,15年来的表现并没有被认为是重要的。
答案 3 :(得分:0)
MFC消息泵确实依赖 在Win32消息循环(它必须)。 但实施非常 不同:基于钩子,调度 由MFC内部处理的消息 而不是依靠 DispatchMessage()API。
我不确定这是否正确。如果您查看 MFC thrdcore.cpp 文件,您将看到此功能:
BOOL AFXAPI AfxInternalPumpMessage()
{
_AFX_THREAD_STATE *pState = AfxGetThreadState();
.......... snip ...........
// process this message
if (pState->m_msgCur.message != WM_KICKIDLE
&& !AfxPreTranslateMessage(&(pState->m_msgCur)))
{
::TranslateMessage(&(pState->m_msgCur));
::DispatchMessage(&(pState->m_msgCur));
}
return TRUE;
}
此功能由MFC PumpMessage 函数调用,您可以看到它使用Win32 DispatchMessage API,就像任何其他Win32应用程序一样。