我现在需要做一个数据采集,存储以及实时显示的程序。我在窗口的onstarttracking button的触发事件中设置硬件链接,程序如下:void DataCollectionWin::OnStartTracking() 
{
.....
     DAQmxErrChk(DAQmxCreateTask ("", &taskHandle));
     DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0,Dev1/ai1,Dev1/ai2,Dev1/ai3,Dev1/ai4,Dev1 /ai5,","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));//和设备的输出端口进行链接
    DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));     DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,1000,0,EveryNCallback,NULL));//用EveryNCallback 事件进行连续数据采集      DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));     DAQmxErrChk (DAQmxStartTask(taskHandle));//开始执行AfxBeginThread( FillTrackingTable,m_trackinglist,THREAD_PRIORITY_NORMAL, 0, 0 );//执行线程将数据显示在窗口listcontrol 对象中
AfxBeginThread( FillTrackingExlFile,m_trackinglist,THREAD_PRIORITY_NORMAL, 0, 0 );//执行线程将数据存入exl文件中
....
}EveryNCallback为全局函数,定义如下:
int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{//EnterCriticalSection(&g_cs);
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,optdata,6000,&read,NULL));//数据存入全局变量data中
//LeaveCriticalSection(&g_cs);Error:
if( DAQmxFailed(error) ) {
DAQmxGetExtendedErrorInfo(errBuff,2048);

DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
 AfxMessageBox(errBuff);
}
return 0;}全局变量data声明为: float64     optdata[6000];现在问题是如何在实时改写optdata的时候,如何在线程FillTrackingTable和FillTrackingExlFile中调用?我试过用criticalsection,但是好像没用。程序发生异常关闭。请高手指点。

解决方案 »

  1.   

    to wangzhi2003:
    [email protected]
      

  2.   

    定义两个event对象,在EveryNCallback内激活,在FillTrackingTable和FillTrackingExlFile回调函数内WaitForSingleObject
      

  3.   

    to ilovedrv:
    谢谢。等我来试一下。
      

  4.   

    有点不明白。“定义两个event对象,在EveryNCallback内激活,"我是应该这样写么:int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)

    hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //应该在这里产生事件么?还是应该放在主进程DataCollectionWin::OnStartTracking() 中????SetEvent(hEvent);DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&read,NULL));。。}
     
    UINT FillTrackingTable(LPVOID pParam)
    {
    WaitForSingleObject(hEvent,INFINITE);
      memcpy(opticaldata,data,6000);//将数据存入局部变量opticaldata
      SetEvent(hEvent);。}很迷惑。请指点一下。
      

  5.   

    Event = CreateEvent(NULL, FALSE, FALSE, NULL);
      内核事件创建放到进程初始化的时候,先创建好,然后FillTrackingTable和FillTrackingExlFile 就可以等待event了EveryNCallback 中再SetEvent来触发