熬之滴水穿石:一切从windows编程开始(2)

                               2--cpu占用率

我重新启动了那个辅助程序,开始分析为什么它一启动中间件软件处理消息就不会丢包了。很快我就想到了答案,那个小小的应用程序最能影响的便是CPU的占用率。我打开了任务管理器,通常情况凭肉眼观察可以看到这个任务管理器是一秒更新一次。一般情况下,CPU的使用率是比较低的。当有些程序执行复杂的操作,CPU的使用率就会上升。我们可以通过任务管理器的进程一栏看到system idle process占用了CPU的空闲时间。一个操作系统中有许多的应用,他们应该遵循怎样的约定。其实以前的操作系统课本对于这些作了很翔实的描述。理解起来就是这么一回事:依附在系统中程序使用率为0的枚举起来就是这几种状态:等待用户输入;等待事件发生;进入休眠状态

那么辅助程序运行后,其实就和中间业务软件开始轮流抢占了CPU的使用时间。所有的程序都是由代码实现的,其实用普通的代码也可以实现程序在系统环境中busyidel这样的情况。只要把cpu占用的这个原理真正清楚就很简单不过。用一个LOOP实现BUSY,这个再简单不过了,一个For循环就搞定了并且用空循环就可以实现。我们写代码的时候如果循环写出了死循环,那结果会怎么?CPU的占用率就会迅猛提升,循环能导致什么呢?循环让程序占用了CPU的使用率,那怎么才能让程序让出CPU使用权?尤其在循环里面,那就是用sleep()方法了,sleep()方法应该是在winodws编程中无论是进程或者线程使用最多的方法了,该方法就是能让当前的线程“停”下来。其实辅助程序的出现,让中间件业务软件交出了CPU的占用权,而恰恰是这个交出使用权,让中间件软件不再“丢包”了。

最终我判定问题肯定在中间件软件的架构源码上,于是乎我通读代码找到最为关键Core部分,我看了消息的处理的方式,果然是在一个while循环里用的windows的postmessage()方法在提交消息给相应的窗口。这段代码应该就是占用cpu的使用率的片段,是的,是的,在这个循环里我并未看到我们常用的sleep()方法。其实就是一个很小的瑕疵,事隔多年后我才真正的找到这个原因,其实找到这个原因很简单,关键是要让自己沉下来,静下心。这段代码在win98和NT下无任何问题,只能说明跟操作系统的调度时间片有关系。也许在低版本的操作系统中,线程频繁的唤醒和挂起,会增加内核时间的不确定性吧!我加了这个方法,然后测试一切都趋于稳定。事后我主动找到客户,说我已解决这个问题。客户为此欣喜不已,因为他们更换了新设备,windows系统由win2000 server变成了win2003 server,然而之前的那个辅助程序在win2003server上就报错,中间软件丢包严重。他们正为此烦恼了,而我把编译后的程序发给客户,程序运行正常,同时也跟从03年就陪伴的辅助程序说再见了。那天是我我特有意义的一天,因为那天开始我已经对自己所学的东西来了一次彻头彻尾的洗礼,那天解决了多年的一笔旧账,我开心不已。趁着那份干劲,我开始对windows编程的领域来一次彻底的自我总结..........

                                          (未完待续........)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值