程序占用很高的CPU,怎么办?

ldy7162cn 2006-04-20 09:59:09
void COscTreDlg::DrawWave(CDC * pDC)
{
CRect rect;
CString str;
double xx=0,yy=0,xxx=0;
int m_right,m_left,m_top,m_bottom;
int i;
int m_Interval=(m_high-m_low)/10;
if(m_Interval<1) m_Interval=1;
CWnd *pWnd=GetDlgItem(IDC_HUABAN); //绘图框指针

pWnd->GetClientRect(&rect);
pDC->Rectangle(&rect);

m_left=rect.left+10;
m_top=rect.top+10;
m_right=rect.right-10;
m_bottom=rect.bottom-20;

int m_IntervalPan = (m_right - m_left)/11;
if (m_IntervalPan < 1 ) m_IntervalPan =1;

// 创建画笔对象
CPen* pPenRed = new CPen;

// 红色画笔
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));

// 创建画笔对象
CPen *pPenBlack= new CPen;

//黑色画笔
pPenBlack->CreatePen(PS_SOLID,1,RGB(0,0,0));

// 创建画笔对象
CPen* pPenBlue = new CPen;

// 蓝色画笔
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));

// 创建画笔对象
CPen* pPenGreen = new CPen;

// 绿色画笔
pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0));

CGdiObject* pOldPen = pDC->SelectObject(pPenRed);

// 绘制坐标轴
pDC->MoveTo(m_left,m_top);

// 垂直轴
pDC->LineTo(m_left,m_bottom);

// 水平轴
pDC->LineTo(m_right,m_bottom);


// 写X轴刻度值
for(i=0;i<10;i++)
{
//str.Format(_T("%d"),m_Min+i*m_Interval);
str.Format(_T("%d"),m_low+i*m_Interval);
pDC->TextOut(m_left+i*m_IntervalPan,m_bottom+3,str);
}
//str.Format(_T("%d"),m_Max);
str.Format(_T("%d"),m_high);
pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);


// 绘制X轴刻度
for (i = m_left; i < m_right-20; i += 5)
{
if ((i & 1) == 0)
{
// 10的倍数
pDC->MoveTo(i + 10, m_bottom);
pDC->LineTo(i + 10, m_bottom+4);
}
else
{
// 10的倍数
pDC->MoveTo(i + 10, m_bottom);
pDC->LineTo(i + 10, m_bottom+2);
}
}

// 绘制Y轴箭头
pDC->MoveTo(m_right-5,m_bottom-5);
pDC->LineTo(m_right,m_bottom);
pDC->LineTo(m_right-5,m_bottom+5);

// 绘制X轴箭头
pDC->MoveTo(m_left-5,m_top+5);
pDC->LineTo(m_left,m_top);
pDC->LineTo(m_left+5,m_top+5);

pDC->SelectObject(pPenGreen);
// 绘制Y轴网格 选择绿色画笔
int iTemp = (m_bottom - m_top)/5;
int iTemp1= (m_right - m_left)/10;
for (i = 1 ;i <= 5 ;i++)
{
pDC->MoveTo(m_left,m_bottom - i*iTemp);
pDC->LineTo(m_right,m_bottom - i*iTemp);
}

//波形图绘制
pDC->SelectObject(pPenBlue);
int DirectY=m_bottom-iTemp; //准线
CPoint point(m_left,DirectY);
pDC->MoveTo(m_left,DirectY);
pDC->LineTo(m_right,DirectY);
//正弦波

pDC->SelectObject(pPenBlack);
//if(MoveX>3.14) MoveX=0;
CPoint point1(m_left-MoveX,DirectY);
m_pStartPoint=point1;
m_pEndPoint=point1;
while(xx-MoveX<(double)m_right)
{
if(xx-MoveX>0) //判断是否超出picture control
{
yy=sin(xx*6.28/102);
m_pEndPoint.x=xx+point1.x;
m_pEndPoint.y=iTemp*yy+point1.y;
if(m_pStartPoint.x>m_left&&m_pEndPoint.x<m_right) //判断是否超出坐标范围
{
//画波形
pDC->MoveTo(m_pStartPoint);
pDC->LineTo(m_pEndPoint);
}
m_pStartPoint=m_pEndPoint;

}
//画可移动的X轴分隔线 选择绿色画笔
pDC->SelectObject(pPenGreen);
for (i = 1 ;i <= 10 ;i++)
{
if((m_right - i*iTemp1)-MoveX>m_left && (m_right - i*iTemp1)+MoveX<m_right)
{
pDC->MoveTo((m_right - i*iTemp)-MoveX,m_top);
pDC->LineTo((m_right - i*iTemp)-MoveX,m_bottom );

}
}
xx=xx+0.1;
pDC->SelectObject(pPenBlack);
}

MoveX=MoveX+0.1;
pDC->SelectObject(pOldPen);
delete pPenRed;
delete pPenBlue;
delete pPenGreen;
delete pPenBlack;
return;
}


我要做一个波形移动的程序,这个是画图的代码,一运行就使用CPU快100%。高手帮我看看呀!!
...全文
308 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
雷宗堂 2006-04-21
  • 打赏
  • 举报
回复
你中间加个sleep(100)肯定就好了
BBirdlyh 2006-04-21
  • 打赏
  • 举报
回复
把画网格,画刻度的函数全部放到ONERASERBKGROUD中去,每次都画他们当然慢了
guogangj 2006-04-21
  • 打赏
  • 举报
回复
pDC->MoveTo(m_pStartPoint);
pDC->LineTo(m_pEndPoint);

这种画法效率低,建议用PolyLine来画,点多的情况下快10倍以上是很正常的。
kevinmartin 2006-04-21
  • 打赏
  • 举报
回复
用Timer吧。
DentistryDoctor 2006-04-20
  • 打赏
  • 举报
回复
1.用双缓冲
2.多久画一次?
KelvinSpace 2006-04-20
  • 打赏
  • 举报
回复
1)
pOldPen = pDC->SelectObject(pPenGreen);
。。。。

pDC->SelectObject(pOldPen);
delete pPenGreen; 没有上一句,好象DELETE是无效的
会有内存泄漏的~
2)可以有内存句柄,CMemDC可以会好一点
wlwlxj 2006-04-20
  • 打赏
  • 举报
回复
死循环一般

15,975

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧