LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

用dll在VC++中实现连续采集处理和存储

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岂不是会影响采集卡采集数据?

 

0 Kudos
Message 1 of 2
(2,468 Views)
Wrong forum. Please post in the CVI forum or the Chinese forum.
0 Kudos
Message 2 of 2
(2,456 Views)