请高手讲讲WM_KICKIDLE和WM_ENTERIDLE

gg606 2010-04-27 02:20:31
我在对话框中加入菜单后,发现用WM_KICKIDLE和WM_ENTERIDLE都能实现菜单的更新,但WM_KICKIDLE却会导致CPU占用率高达50%,WM_ENTERIDLE 则不会。
请高手讲解一下这两个消息的用法,
...全文
1343 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2011-08-05
  • 打赏
  • 举报
回复
WM_KICKIDLE确实比较令人郁闷的。
finalbad 2010-12-28
  • 打赏
  • 举报
回复
讲的好
dianhui 2010-12-06
  • 打赏
  • 举报
回复
一个自绘制窗口开起后什么都不干,发现使用系统内存就不断增加,用SPY查看,发现该窗口不断收到一个WM_KICKIDLE消息,自己却对该消息一无所知,以前从来没用过也没见过!
gg606 2010-05-30
  • 打赏
  • 举报
回复
对,return 0
结帖!
lx_616_at_yeah_net 2010-05-03
  • 打赏
  • 举报
回复
在WM_KICKIDLE的处理函数里return FALSE;就不会导致CPU占用率上升了!
----------------------------------------

不错啊!
这样就解决了,太出乎意料了。。。

typedef LONG LRESULT;
返回0,会好一些。

这方面资料好少。也只能误打误撞了。
哈哈...
gg606 2010-05-02
  • 打赏
  • 举报
回复
to 楼上:
是啊,看了RunModalLoop()的代码就明白了!
在WM_KICKIDLE的处理函数里return FALSE;就不会导致CPU占用率上升了!
我看你也发过一个关于WM_KICKIDLE的帖子哈。
lx_616_at_yeah_net 2010-05-01
  • 打赏
  • 举报
回复
对话框的菜单更新“WM_KICKIDLE却会导致CPU占用率高达50%”??????
------------------------------------------------------------

我也用WM_KICKIDLE,在对话框里进行了菜单更新。并没有出现这种状况。。。
(我是用任务管理器查看CPU占用率的)
gg606 2010-04-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xwsn007 的回复:]
可能没父窗口么,桌面窗口呢?
[/Quote]
可是构造函数都是形如CTestDlg(CWnd* pParent = NULL);这样啊?
调用时,也是调的默认的构造函数:
CTestDlg dlg;
m_pMainWnd = &dlg;
xwsn007 2010-04-29
  • 打赏
  • 举报
回复
可能没父窗口么,桌面窗口呢?
gg606 2010-04-28
  • 打赏
  • 举报
回复
但我还有个疑问,我的主窗口就是模态对话框,它没有父窗口,那么,它为什么还可以收到 WM_ENTERIDLE 消息? WM_ENTERIDLE 消息是发给父窗口的呀!
gg606 2010-04-28
  • 打赏
  • 举报
回复
			// call OnIdle while in bIdle state
if (!(dwFlags & MLF_NOIDLEMSG) && hWndParent != NULL && lIdleCount == 0)
{
// send WM_ENTERIDLE to the parent
::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);
}
if ((dwFlags & MLF_NOKICKIDLE) ||
!SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))
{
// stop idle processing next time
bIdle = FALSE;
}


这是RunModalLoop()中的一段代码,可以看出,WM_ENTERIDLE是在无MLF_NOIDLEMSG标志,且在处理过“IdleMessage”之后发送,而WM_KICKIDLE则只要无MLF_NOKICKIDLE标志即发送。

那么使用lIdleCount,即WM_KICKIDLE消息的lParam应该可以解决CPU占用的问题。

模态对话框还真是有点复杂。看了一篇高人的文章才知道MFC在使用模态对话框的时候实际上也是使用非模态对话框!
jameshooo 2010-04-27
  • 打赏
  • 举报
回复
有人回答得这么详细,楼主居然直接无视,无论别人回答的对与错,好歹吭一声,否则给人一种很不尊重人的印象。
gg606 2010-04-27
  • 打赏
  • 举报
回复
自己顶,快沉到底了!
sk_sakula 2010-04-27
  • 打赏
  • 举报
回复
楼上讲解的不错,学习了
尹成 2010-04-27
  • 打赏
  • 举报
回复
wm_enteridle:此消息通知应用程序的主窗口过程,模式对话框或菜单已进入空闲状态。在处理了一个或多个以前的消息后消息队列中不再有消息,则称模式对话框或菜单进入空闲状态。
而wm_kickidle是mfc中未公开的一个消息。
第一个消息的wParam表示:指名消息是否是正在被显示的对话框或菜单进入空闲状态的结果,它是下列值中的一个:
MSGF_DIALOGBOX:因为对话框正被显示,系统正空闲。
MSGF_MENU:因为菜单正被显示,系统正空闲。
lParam参数表示:如果wParam为MSGF_DIALOGBOX,则为含有对话框的句柄;如果wParam为MSGF_MENU,则为包含正被显示菜单的窗口的句柄。
当接收到wm_enteridle消息时,说明消息队列中无其他消息了,这时显示的菜单肯定是更新的菜单
对于wm_kickidle,还是从网上搜集点英文资料把,这个消息很奇怪,微软一直没公开
尹成 2010-04-27
  • 打赏
  • 举报
回复
补充说明:

也就是说不断有WM_KICKIDLE发送更新窗体。
模式对话框时,MFC启动另外一个消息循环。
当没有消息等待处理的时候,CWnd::DoModal向对话框发送一个WM_KICKIDLE消息
可能影响性能。
尹成 2010-04-27
  • 打赏
  • 举报
回复
WM_ENTERIDLE在消息队列空闲时候发送,WM_KICKIDLE则是即时发送,随时听候命令,所以就出现上面情况,

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧