本程序是一个数据采集卡的采集数据程序,数据采集卡一共64个通道,当通道比较多的时候 需要画多条线(选择0-63通道时画64条线)所有通道的数据 按通道号依次放在硬件缓冲区中,采集数据需要显示Teechart控件上,我目前所做的是将数据从硬件读取出来
按一定的数据量对数据进行处理,当采样率比较低、通道比较少的时候 Teechart画图还比较及时的反应输入波形或是电压的变化,当采样率高 或是通道多的时候 程序就直接卡死了 ,我使用调试模式监视了下 发现是画线的时候特别慢 ,但是多通道和单通道相同数据,多通道也会出现程序低调的现象,下面是我的那部分处理代码,请高手指点一二 看能不能提高下效率:if(dwlen>0)
{
memset(lbuf,0,sizeof(lbuf));//初始化软件分配的FIFO lbuf是WORD类型
memset(ldestBuf,0,sizeof(ldestBuf));//初始化软件分配的FIFO ldestbuf是float类型
dwfactl = AECAD64Z_AD_Read(hCard, dwlen, lbuf);//从硬件读取数据
if(dwfactl != dwlen)//读取数据量 不正确报错
{
MessageBox("����ʵ�ʽ��յ��������FIFO���������һ��","����",MB_OK|MB_ICONERROR);
return ;
} dwPointNo = dwlen/chnum;//由于是数据是按通道排列,通过通道的数据 算出没个通道的数据量 for(n=0;n<dwPointNo;n++)//通过公式 将数据转换成电压值
{
for(k=m_beginNo;k<=m_endNo;k++)
{
if(k>23)
{
srt = lbuf[n*chnum+k - m_beginNo];
stt = srt; 
ldestBuf[n*chnum+k - m_beginNo] = (float) (stt * 20.0f)/(65535.0f * m_bs);
}
else
{
srt = lbuf[n*chnum+k - m_beginNo];
stt = srt; 
ldestBuf[n*chnum+k-m_beginNo] = (float) (stt * 60.0f)/(65535.0f * m_bs);
}
}
} if(blsavetofile)//判断是否保存数据
{
SaveFile(fdata,lbuf,ldestBuf,dwlen);//保存数据至文件
}

if(blRealTime)//判断是否实时显示
{
m_chart.SetRedraw(FALSE);//将图形的重绘禁止
for (n=0; n<dwPointNo; n++)
{
for(j=0;j<chnum;j++)//添加j个通道的1个点 一共添加dwPointNo个点 从而连成一个波形
{
m_chart.Series(j).AddXY(XValue,ldestBuf[n*chnum+j],NULL,color[j]);
}   
XValue += Step; double incstep=1000*Step;

if(XValue > incstep)//当添加的范围超过设置的一屏的宽度,将坐标向后移
{
m_chart.GetAxis().GetBottom().SetMinMax(XValue-incstep,XValue);
incstep += 1000*Step;
}

m_chart.SetRedraw(TRUE); //画完所有这一批数据的点 将重绘使能打开
} //end of if(blRealTime)
}//end of if(dwminl>0)

解决方案 »

  1.   

    能不能不用adxy 用addarray?估计会快点啊 我都是这么用的
      

  2.   

    addarray 怎么实现呢~感觉数据转换有点麻烦呢~
      

  3.   

    网上有例子的哇 用colesafearray做的 
      

  4.   

    TeeChart画图应该不慢,慢主要是因为文件的读写吧。
      

  5.   

    我又尝试这用COleSafeArray 去实现了下、、、但是看不到线的颜色了由于我规定了一屏的点数 我的坐标是往后移的,但是我用鼠标拖到前面的零点开始的界面,也没有线的颜色
      

  6.   

    有童鞋做过实验么  用AddXY函数显示1000个点 需要25ms左右  这个时间正常么?