1.目的是连续采集板卡PCI-4474的数据,并进行处理,存储(采样频率设置为最大102k,每次从通道读取1000个数据)
不知道大家用什么方法来实现的,我的想法是:
2.想法是开两个线程 1用来处理数据 2用来写数据,因为数据量很大,很快,等采集一定时间再存储
在int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)这个callback函数里面实现
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,SAMPLENUMBER,10.0,DAQmx_Val_GroupByScanNumber,l_data,4*SAMPLENUMBER,&read,NULL));
EnterCriticalSection(&g_hCriticalSection);
//将l_data拷贝到全局数组中,
SetEvent(g_hPorcessEvent);//处理这4000个数据)(四个通道,每个通道1000个数据)//告诉采集线程
//索引
g_index+=4000;
if(g_index == SIZE_OF_BUFFER) g_index = 0;//缓冲区满的时候,从头开始计数
if(g_index %(SIZE_OF_BUFFER/2) == 0)
{
//设置一个大的缓冲区,当大缓冲区存了一半的时候,SetEvent(线程2去存储这个大缓冲区的数据)
}
LeaveCriticalSection(&g_hCriticalSection);
线程1
{
WaitForSingleObject(g_hPorcessEvent,INFINITE);
EnterCriticalSection(&g_hCriticalSection);
//处理4000个数据
LeaveCriticalSection(&g_hCriticalSection);
}
线程2
{
WaitForSingleObject(g_hSaveEvent,INFINITE);
EnterCriticalSection(&g_hCriticalSection);
//存储
if(g_index >= SIZE_OF_BUFFER/2)//如果此时缓冲区的指针到了后面,说明前面已经存储满了
{
for(int i=0; i<SIZE_OF_BUFFER/2;i++)
{
//写缓冲区的前半部分
}
}
else
{
for(int j=SIZE_OF_BUFFER/2; j<SIZE_OF_BUFFER;j++)
{
//写缓冲区的后半部分
}
}
LeaveCriticalSection(&g_hCriticalSection);
}
3.不知道这样的流程对不对 我用的是生产者消费者线程,发现采集的时候,SetEvent不能告诉处理线程和存储线程
就是说会有数据丢失,来不及处理和存储,如果 用sleep函数的话是可以的,但是用了sleep岂不是会影响采集卡采集数据?