我用数据采集卡读数据,设置读线程ReadThread,循环读取如下:
- C/C++ code
while(true){ if(ReadDevice(hDevice,ADBuffer,ReadSize,RetReadSize)) hEvent.SetEvent(); sleep(500);}
在绘图线程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]; } }}
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