CLI应用为了美观有时会加上动画,相信所有用户都希望看到流畅的动画吧?可是,诶呦喂,我的动画怎么在windows下可以流畅显示,在类unix下怎么就非常卡顿呢。。。
也许是基于性能考虑,stdout输出带有缓冲区,输出的文本不会立即显示在终端,而是等一定程度以后一股脑给输出出来。\n虽然可以让程序立即输出,但是在进度条等类似动画里会让动画实现较为麻烦;等待输出流关闭更不用想;而std::flush这个操纵符,可以立即将缓冲区内的文本输出出来,解决不连贯的问题。
我们以以下代码为例子:
#include<bits/stdc++.h>
#include<unistd.h>
using namespace std;
void process(int num,int len){
int t=(num+1)*100/(len*6);
for(int i=0;i<len+6;i++){
cout<<"\b";
}
string point[6]={" ", "▏", "▎", "▍", "▊", "█"};
for(int i=0;i<num/6;i++){
cout<<point[5];
}
cout<<point[num-(num/6)*6];
for(int i=0;i<len-(num/6)-1;i++){
cout<<" ";
}
cout<<"] ";
cout<<t<<"%";
if(t<10){cout<<" ";}
else if(t<100){cout<<" ";}
}
void processbar(int len,int speed){
cout<<"[";
for(int i=0;i<len;i++){
cout<<" ";
}
cout<<"] 0% ";
for(int i=0;i<len*6;i++){
process(i,len);
//cout<<flush;//TODO
usleep(speed*1000);
}
}
int main(){
processbar(20,100);
cout<<endl;
return 0;
}去掉cout<<flush;注释前:

去掉注释后:

差别非常明显,加上这行代码以后动画流畅许多。