关于Windows中的系统消息循环占用CPU的疑问

    原文地址:点击打开链接
    曾有这样的疑问,为什么很多资料中都有关于windows中的While(getmessage(&msg,Null,0,0)){..}消息循环不占用CPU的说法?今天特有关此事查了一下资料,原来是这样子啊!
 
    说,其实这里的while(){}循环是占用cpu的,只是getmessage()是一个阻塞型的函数,当消息队列中没有消息时,它会检查确认,当确认消息队列为空时,则进行V操作,从而使线程外于阻塞状态,不被激发,另外我们知道外于sleep状态的线程是不占cpu的,是故当getmessage无返回值时,while()也不执行。整个线程被阻塞,从而不占用CPU资源。
    当Winows程序启动时,会注册一个窗口类,注册的窗口类中包括当前窗口的风格、消息处理函数等等。然后,程序创建一个该注册窗口类的主窗口,接着,显示这个主窗口并进入到消息循环。在消息循环中,将不断地从窗口自身的消息队列中读取消息,并调用注册的窗口消息处理函数对不同的消息进行处理。
 
 GetMessage函数是一个阻塞型的函数,当消息队列中没有消息时,GetMessage会处于阻塞状态。一旦有消息到达,进程会被唤醒,GetMessage马上返回。实现时,使用了一个信号量, GetMessage函数在确定没有消息可读时,对这个信号量进行一个V操作,从而使线程阻塞。而PostMessage、SendNotifyMessage、SendSyncMessage等任何一个发送消息函数在发送完消息之后,都会读取这个信号量的值,当发现这个值等于零时,即表示读消息的线程当前已阻塞,这时就会作一次P操作,来唤醒睡眠的线程。
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值