今天复习了windows线程的调度,优先级等相关内容。以为将一个进程和它的线程都设为优先级最低,那么该进程将在电脑空闲的时候才会运行。我突然联系到有的程序比方说腾讯QQ或者屏保程序是不是将要调用的线程设为优先级最低,等到电脑空闲或空闲一段时间(具体时间程序当然可以调)才开始调用呢?然后我写程序验证了一下,发现任何时候该线程都会执行,哪怕是CPU到达了100%。为什么会这样呢?仔细看书得知,当今计算机运算速度非常快,哪怕鼠标键盘一直动个不停,计算机CPU还是会有很多空闲时间,这个空闲时间足以运行那些低优先级的线程。还有哪怕是其他程序写个死循环,CPU到达了100%,低优先级程序仍然有机会获得CPU,因为当系统检测到某线程饥饿了很久时(也就是没有得到CPU时间片段),系统会自动提升它的优先级来获得CPU时间片段。所以要想到达电脑空闲时间才会执行某个任务,以上的方法是行不通的!
那么应该怎么做呢?经过在CSDN上努力搜索,终于找到一种解决方案。
windows提供一个API函数GetLastInputInfo(PLASTINPUTINFO plii)可以得到电脑最后输入事件的时间,该时间的意思是系统开机到那个时间流逝的毫米数。如果想在电脑空闲5分钟后执行某个任务将很好实现:
<span style="white-space:pre"> </span>LASTINPUTINFO lp ; lp.cbSize = sizeof(lp) ; GetLastInputInfo(&lp) ; DWORD dwTick = GetTickCount() ; //获取当前的时间 if(dwTick - lp.dwTime > 5 * 60 * 1000){ ...//do something ; }
但是我总感觉这种方法太过于简单,因为代码才那么几行,一点都高深,呵呵。腾讯QQ是不是也通过这种方式呢?还是有更高级的方法?望大牛们指教,不胜感激!
类似QQ电脑空闲5分钟后自动更改状态的实现,布布扣,bubuko.com
原文地址:http://blog.csdn.net/zxm342698145/article/details/27807445