首先有一个控制类CPCI8622_SampleData,这个类是连接AD板卡的
//赋初值
CPCI8622_SampleData::CPCI8622_SampleData()
{
.....
m_hDevice = NULL;
.........
}
//获取句柄
bool CPCI8622_SampleData::OpenCard()
{
........     
m_hDevice = PCI8622_CreateDevice(0); 
.........
return true;
}
//采集AD信号
bool CPCI8622_SampleData::ReadData()
{
    if(!PCI8622_ReadDeviceProAD_Npt(m_hDevice, gl_ADBuffer[gl_nReadIndex],iReadSizeWords, &gl_ReadSizeWords))
    {
AfxMessageBox("Read Data Error.....");
return false;
     }
     .....
     return true;
}//主类CWMeasureApp打开板卡
BOOL CWMeasureApp::InitInstance()
{
...............
         //在头文件中定义了一个对象 CPCI8622_SampleData  m_pPCI8622
if(!m_pPCI8622.OpenCard())
{
AfxMessageBox("AD采集卡PCI8622打开失败,请关闭计算机检查采集卡");
return FALSE;
}
         //通过监控获取的句柄为m_hDevice = 0x000005d
..........
return true;}又有一个类CDlgInOutSignal要调用AD板卡的采集函数,好实时显示采集电压值void CDlgInOutSignal::OnTimer(UINT nIDEvent) 
{
..............
//我的方法是重新建一个对象  
CPCI8622_SampleData  m_PCI8622
m_PCI8622.ReadData();...................}问题出现了,系统报错"Read Data Error....." 经过监控 主类调用打开板卡函数后返回的句柄m_hDevice = 0x000005d是正确的,可是监控过程中发现当类CDlgInOutSignal建一个对象时  CPCI8622_SampleData类又一次运行CPCI8622_SampleData::CPCI8622_SampleData() 将句柄初始化所以调用,再调用PCI8622_ReadDeviceProAD_Npt(m_hDevice, gl_ADBuffer[gl_nReadIndex],iReadSizeWords, &gl_ReadSizeWords))时句柄错误,请问高手们这个问题如何解决?

解决方案 »

  1.   

    //CPCI8622_SampleData m_PCI8622
    m_PCI8622.ReadData();
    不用重建一个,就用之前创建好的
      

  2.   

    主类中我是这样定义对象的,在CWMeasureApp头文件中
    class CWMeasureApp : public CWinApp
    {
    public:
    CPCI8622_SampleData  m_pPCI8622;
    }
      

  3.   

    既然重新创建对象会重新初始化,那就不要再重新建立对象了,用原来的对象就行。
    (CWMeasureApp*)AfxGetApp()->m_pPCI8622
      

  4.   

    谢谢大家,不过我按4楼那么写还不行,我是这么写的
    CWMeasureApp* pApp = (CWMeasureApp*)AfxGetApp();
    pApp->m_pPCI8622.ReadData();
    经过测试,没有问题。