要从USB采集卡采集大量数据,再以数据形式显示出来(波形显示以后再加),现是用多线程做的:一个是采集线程,一个数据显示线程,部分程序如下:
// 创建数据采集子线程
m_ReadThread=AfxBeginThread(ReadThread,NULL, THREAD_PRIORITY_ABOVE_NORMAL, 0, CREATE_SUSPENDED);
m_ReadThread->m_bAutoDelete=false;    
// 创建窗口绘制子线程
m_DrawWindowThread=AfxBeginThread(DrawWindowProc,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
m_DrawWindowThread->m_bAutoDelete=false;    
// 创建数据采集与窗口绘制同步事件对象
hEvent = USB2008_CreateSystemEvent();
// 根据通道数,重新设置视图滚动范围
CUSBportView* pDigitView=(CUSBportView*)(CWnd::FromHandle(m_hWndDigit));
CMainFrame* pADFrame=(CMainFrame*)AfxGetMainWnd();
CMainFrame* pShow=(CMainFrame*)AfxGetMainWnd();
//CMainFrame* pADFrame=(CUSBportApp*)AfxGetApp()->m_ADFrame;
CurrentIndex=0;
int nChannelCount=ADPara.LastChannel -ADPara.FirstChannel +1;
//m_nDrawPointNum=(8192-8192%nChannelCount)/nChannelCount;
// 在设备开始运行时,禁止操作硬件参数
CComboBox* pFirstChannel=(CComboBox*)pShow->m_wndSetupDlg.GetDlgItem(IDC_COMBO_FirstChannel);
pFirstChannel->EnableWindow(FALSE);
CComboBox* pLastChannel=(CComboBox*)pShow->m_wndSetupDlg.GetDlgItem(IDC_COMBO_LastChannel);
pLastChannel->EnableWindow(FALSE);
pShow->m_ComboADMode()->EnableWindow(FALSE);
pShow->m_EditIntervalFrequeny()->EnableWindow(FALSE);
CWnd* pFrequence=pShow->m_wndSetupDlg.GetDlgItem(IDC_EDIT_Frequence);
pFrequence->EnableWindow(FALSE);
// ChannelCount=ADPara.LastChannel-ADPara.FirstChannel+1;   // 在开始采集时,确定通道数
hDevice =USB2008_CreateDevice(theApp.m_CurrentDeviceID);
if(hDevice==INVALID_HANDLE_VALUE)

AfxMessageBox("创建设备对象失败...",MB_ICONSTOP,0);
return ;
} if(!USB2008_InitDeviceAD(hDevice, &ADPara))
{
AfxMessageBox("不明确的初始化错误...",MB_ICONSTOP,0);
return ;
} // 注意: 此函数一旦返回TRUE,设备即开始传输,客户程序必须能以最快的速度读取数据状态,
    pShow->m_ComboTriggerSource()->EnableWindow(FALSE);
pShow->m_ComboGroundingMode()->EnableWindow(FALSE);
bDeviceRun=TRUE;  // 告之采集线程可以工作了
bCollectData=FALSE; // 表示已开始采集数据,不能再启动数据采集
m_ReadThread->ResumeThread();  // 启动采集线程ReadThread
m_DrawWindowThread->ResumeThread();
pADFrame->SetStatusTimer(500); // 由此定时器更新采集进度显示
}UINT ReadThread(PVOID hWnd)  // 读数据线程
{
   //此线程应没有错误,不列出了
}
UINT DrawWindowProc(PVOID hWnd)  // 绘制数据线程
{
CUSBportApp *pApp=(CUSBportApp *)AfxGetApp();
//CUSBportDoc* pDoc=pApp->pADDoc;
    CUSBportView* pDigitView=(CUSBportView*)((CFrameWnd*)pApp->m_pMainWnd)->CFrameWnd::GetActiveView();
    CUSBportDoc* pDoc=pDigitView->GetDocument();
BOOL bFirst=TRUE;
CurrentIndex=0;
int RedrawNum=0;
while(bDeviceRun)  // 循环采集AD数据
{
RedrawNum++;
WaitForSingleObject(hEvent, INFINITE);
CurrentProgress++;
if(bDataProcessing==FALSE) DrawIndex=CurrentIndex; // 如果窗口已完成数据刷新,则置新的缓冲区索引号,使之绘制新缓冲区数据
    if(nProcessMode)  // 数据处理
{
    if(!m_FirstScreenStop || bFirst)  // 如果不停止首屏显示
{
    //if(RedrawNum%5==0)
    {
//pDigitView->UpdateData(TRUE);
//pDoc->UpdateAllViews(NULL);
pDoc->UpdateAllViews(pDigitView, 1, NULL);  // 传递1,要求重绘数字视图
m_bProgress=TRUE; // 使OnDraw函数能更新进度条
bFirst=FALSE; // 置不是第一次采集的标志
     }
}
}
return TRUE;
}
可是就是这个"绘制数据线程"函数中的一行
    pDoc->UpdateAllViews(pDigitView, 1, NULL);  // 传递1,要求重绘数字视图
出现运行错误,请哪位高手GG,JJ拉我一把,谢谢啊………………………
(错误好像是view指针方面的,我也不懂啦,呜…………………)