当前位置: 代码迷 >> 多核软件开发 >> Tchart绘制波形以及线程同步有关问题
  详细解决方案

Tchart绘制波形以及线程同步有关问题

热度:8251   发布时间:2013-02-26 00:00:00.0
Tchart绘制波形以及线程同步问题
我用数据采集卡读数据,设置读线程ReadThread,循环读取如下:
C/C++ code
while(true){    if(ReadDevice(hDevice,ADBuffer,ReadSize,RetReadSize))    hEvent.SetEvent();    sleep(500);}
数据放在缓冲区ADBuffer中,hDevice,ReadSize,RetReadSize分别是设备句柄、每次读取个数、实际读取个数,hEvent是同步事件。

在绘图线程ProcessThread中用TChart绘制动态波形,程序如下:

C/C++ code
while(true){    WaitForSingleObject(hEvent,INFINITE);    hEvent.ResetEvent();    int n=10;    float Temp[1000];//说明,Temp是和ADBuffer[0]的一个转换,这里就没写出具体如何转换了    tchart.GetSeries(0).Clear();    for (i=10;i>0;i--)    {            tchart.GetSeries(0).AddXY(i,Temp[n-10+i],"",RGB(0,0,0));    }    n++;    if (n==1000)//设定上限,防止int型n超出范围    {    n=20;    for (int j=11;j<21;j++)    {        Temp[j]=Temp[980+j];    }     }}
1、程序编译创建以及开始运行都没问题,可是运行一小段时间会出现形如"access violation at address 00EB1C96 in module 'TeeChart.ocx',write of address 411E85AC"的错误。
2、调试时程序运行步骤也有问题,ProcessThread中的for循环运行到比如 i=7 就跳到ReadThread线程中读数据,然后又跳到for中接着运行 i=6;
3、由于是死循环,调试时在不定时间错误总会出现在 tchart.GetSeries(0).Clear()或者
tchart.GetSeries(0).AddXY(i,Temp[n-10+i],"",RGB(0,0,0))语句中

我程序上有错吗,还是tchart用法不对?刚学vc对话框不久,求高人指点。


------解决方案--------------------------------------------------------
int n=10;
这句应该移到while前面吧?否则你的n==1000还有什么意义?
另外,
WaitForSingleObject(hEvent,INFINITE);
hEvent.ResetEvent();
这两句是不好的,可能出现不安全.你应该创建一个自动reset的event,它将会在WaitForSingleObject返回成功后自动reset.
出错时看看n和i等于多少吧.不是有调试环境吗?
------解决方案--------------------------------------------------------

for (i=10;i>0;i--)
{
tchart.GetSeries(0).AddXY(i,Temp[n-10+i],"",RGB(0,0,0));
}

这段有点问题啊..楼主仔细研究下
------解决方案--------------------------------------------------------
tchart我没用过
不过感觉它应该不是线程安全的吧
你看看是不是可以考虑把tchart所在窗口的句柄到线程里来
然后通过句柄发消息操作tchart