我现在需要做一个数据采集,存储以及实时显示的程序。我在窗口的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,但是好像没用。程序发生异常关闭。请高手指点。
{
.....
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,但是好像没用。程序发生异常关闭。请高手指点。
解决方案 »
- 列表框连接数据库的问题
- ComBoBox控件如何对data中的数据进行排序
- 求助:我新建了一个 Win32 Application 工程 (Games3) ,然后按 F5 ,提示有错,这是为什么?谢谢!
- 怎样验证数据类型
- 一个文件读取问题
- 请问各位:如何通过TAB键移动光标呢?
- ReadProcessMemory函数读出不正确数据
- 在一个模态对话框弹出完全显示后,马上弹出另一个对话框,该如何实现
- 非常非常简单的问题
- 菜鸟求救:如何改变对话框各种控件的字体大小呢?各位帮帮忙吧!
- 一阶偏导产生较宽边缘,二阶偏导产生较窄边缘??
- 改写HTML代码后,代码一直在OnDownloadBegin, OnNavigateComplete2,OnDocumentComplete间死循环,没有正常显示
[email protected]
谢谢。等我来试一下。
{
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);。}很迷惑。请指点一下。
内核事件创建放到进程初始化的时候,先创建好,然后FillTrackingTable和FillTrackingExlFile 就可以等待event了EveryNCallback 中再SetEvent来触发