TL(TypeLetters)功能扩展#002:
解放CPU,带打字练习软件原理分析。
今天Type Letters时发现一个问题,TL的CPU占用达到了14%,按说一个小小的打字练习软件,不会有这么高的CPU占用率,是什么原因导致的呢?
超高的CPU占用率截屏
在解决这个问题之前,我们需要先对打字练习软件的运行原理做一个了解。
打字练习软件原理
请看代码:
int main(){
char key;
while(1){
//监听键盘
if(kbhit()){
key = getch();
//全局响应的按键
if(key==12){
//ctrl+l,退出
}else if(key>0x1F&&key<0x7F){
//是键盘字符,则输出字符,0x20,空格;0xD,回车键
}
}
}
}
这是TL主程序main()的主体结构,程序很简单,使用了一个while()循环对键盘操作进行监听,while(1)的意思就是一直执行循环体,这也就是常说的“死循环”。
在循环中主要有两步操作:
1、如果按下Ctrl+L组合键,就退出程序,通过它来打破“死循环”;
2、按下其他按键则输出到屏幕上显示出来,
查找问题原因:
打字练习软件原理就是这样,看到这里,有细心的读者可能已经看出问题了:
这个while()循环会一直向CPU询问“有没有键盘输入?”、“有没有键盘输入?”、“有没有键盘输入?”…
是的,你说的没错,问题就是出在这里,现在的CPU执行速度都很快,如果在1秒钟内,可以执行while()循环体10万次,CPU就会被询问10万次;如果可以执行while()循环体100万次,CPU在1秒钟中内就会被询问100万次,这个询问数量一点都不夸张,你可以把dout(to_string(dCount++)+"#5 lineCurrent:"
这一行前面的注释取消掉,就能体会到CPU的辛苦程度了。
解决这个问题:
我们敲击键盘的速度和CPU的运行速度相比是非常慢的,录入高手在1分钟内能打750个字母,750除以60秒,每秒钟也就是最多有12次击键动作,所以我们可以给CPU的询问次数加一个频率限定,比如20次/秒,这样我们的CPU既不会被询问致死,也可以保证我们的击键动作得到及时的响应。修改代码如下:
int main(){
char key;
while(1){
//监听键盘
if(kbhit()){
key = getch();
//全局响应的按键
if(key==12){
//ctrl+l,退出
}else if(key>0x1F&&key<0x7F){
//是键盘字符,则输出字符,0x20,空格;0xD,回车键
}
}
Sleep(50); //单位:毫秒
}
return 0;
}
在while()循环体内的最后,我们加了一句代码Sleep(50);
,也就是让CPU休息50毫秒,1秒钟内我们只向CPU发起20次的询问“有没有键盘输入?”。TL让CPU休息,意思就是让CPU在间隔的50毫秒内可以去干其他的事情了,不用管我。
Sleep(50);
这行代码加上之后很管用,TL的CPU占用率立即降成了0%,解放CPU的目标成功实现。
TL(TypeLetters)源码下载
链接:打字练习软件TL(TypeLetters)的C++源码可以下载了,快去看看吧!
TL中输入的内容都看不见了,怎么办?
退出TL,重新进入,就可以继续使用了。解释:TL只识别英文资料,你之前输入的原文可能有中文或全角标点符号,例如:",。:、;ü"等,用文本编辑器把原文打开,把这些非英文符号去除掉,保存,重新运行TL,使用"Ctrl+O"再次打开这个原文就可以了。