问题描述
- 程序运行CPU占用率过高,只是一个度读写得的程序,但是不明白为什么,代码如下
-
CFileDialog file_dlg(TRUE); file_dlg.m_ofn.lpstrTitle="读取数据对话框 write by wang"; file_dlg.m_ofn.lpstrFilter="Text File(*.dat)*.datAll File(*.*)*.*"; if(IDOK==file_dlg.DoModal()) { CFile read_file(file_dlg.GetFileName(),CFile::modeRead); unsigned int file_length=read_file.GetLength(); unsigned char *pbuf; unsigned int i,j,u,TotalNum,Pos=0; pbuf=new unsigned char[file_length]; read_file.Read(pbuf,file_length); read_file.Close(); TotalNum=file_length/204; unsigned int *TagTable=new unsigned int[TotalNum]; memset(TagTable,0,TotalNum); for(i=0;i<file_length;i++) { if((pbuf[i]==0x46)&&(pbuf[i+1]==0x54)&&(pbuf[i+204]==0x24)&&(pbuf[i+205]==0x24)) { TagTable[Pos++]=i; } } CString PointSaveCurrent; CString PointSave; PointSave=_T(""); PointSaveCurrent=_T(""); float *vertex=new float[(Pos)*200]; float *angle=new float[Pos]; double pi=3.1415926; unsigned int point=0; for(i=0;i<Pos;i++) { j=TagTable[i]; PointSaveCurrent.Format("第%d帧:rn",i+1); PointSave+=PointSaveCurrent; for(u=0;u<100;u++) { point=pbuf[u*2+j+4]+pbuf[u*2+j+5]*256; vertex[u*2+i*200]=point*sin((50.0-u)/180*pi); vertex[u*2+1+i*200]=point*cos((50.0-u)/180*pi); angle[i]=(pbuf[j+206]*256.0+pbuf[j+207])/100.0; PointSaveCurrent.Format("x:%f y:%f 角度:%frn",vertex[u*2+i*200],vertex[u*2+1+i*200],angle[i]); PointSave+=PointSaveCurrent; } //memset(point,0,100); } CFile file("data.txt",CFile::modeCreate|CFile::modeWrite); file.Write(PointSave,strlen(PointSave)); file.Flush(); file.Close(); delete[] vertex; delete[] angle; delete[] TagTable; delete[] pbuf; vertex=NULL; angle=NULL; TagTable=NULL; pbuf=NULL; }
解决方案
循环当中需要响应系统消息,这个不知道在你的开发工具中是否可以使用或有替代:Application->ProcessMessages(); // 在长时间循环中响应消息
解决方案二:
估计是你的对话框等阻塞了,所以造成UI线程卡死。CPU占用很高
解决方案三:
以调试方式运行程序,中断,看停在哪一行。
解决方案四:
里面进行了Pos*100 次的sin 和 cos 计算,这个在Pos 很大的时候,且机器配置比较低的时候比较消耗资源~
一般的文件读取和写入操作,不怎么耗时间。MFC 读写文件有自己的缓存机制!
====> DWORD start = GetTickCount();
for(i=0;i<Pos;i++)
{
j=TagTable[i];
PointSaveCurrent.Format("第%d帧:rn",i+1);
PointSave+=PointSaveCurrent;
for(u=0;u<100;u++)
{
point=pbuf[u*2+j+4]+pbuf[u*2+j+5]*256;
vertex[u*2+i*200]=point*sin((50.0-u)/180*pi);
vertex[u*2+1+i*200]=point*cos((50.0-u)/180*pi);
angle[i]=(pbuf[j+206]*256.0+pbuf[j+207])/100.0;
PointSaveCurrent.Format("x:%f y:%f 角度:%frn",vertex[u*2+i*200],vertex[u*2+1+i*200],angle[i]);
PointSave+=PointSaveCurrent;
}
//memset(point,0,100);
}
====> DWORD duration = GetTickCount() - start;
看看duration 的值是多少~