封装了一个ADO的类,将_Connect,Recordset,Command的操作都封装在CXXXDb类里,它的析构函数是这样的/释放Connection对象
if (m_pConn !=  NULL)
{
m_pConn.Release();
} //释放Recordset对象
if (m_pRecordset != NULL)
{
m_pRecordset.Release();
} //释放Command对象
if (m_pCommand != NULL)
{
m_pCommand.Release();
} CoUninitialize();在一个CXXXApp::InitInstance()构造一个数据库连接m_pxxxDb,创建一个线程A,并将m_pxxxxDb作为参数传递给线程A,当线程A正在执行一个数据库操作时(正在执行中),程序在CXXXApp::ExitInstance()里面调用TerminateThread()杀死线程A,然后delete m_pxxxDb; 程序执行到CXXXDb::~CXXXXDb()里面的m_pConn.Release();语句里,程序就一直阻塞在这里,退不出来。
不知道为什么会产生永远阻塞的情况,我查看了Release()的帮助,它只是调用IUnknown::Release()删除接口而已,而且这是一个STA套间,在STA套间里面,操作都是顺序执行的,在数据库操作没有被执行完前,应该不会去执行Release()操作,这样顺序执行的话,应该不会有阻塞才是啊。奇怪

解决方案 »

  1.   

    //释放Recordset对象 
    if (m_pRecordset != NULL) 

       // CLOSE没有? 要先Close
    m_pRecordset.Release(); 
    } //释放Command对象 
    if (m_pCommand != NULL) 

    m_pCommand.Release(); 

    /释放Connection对象 
    if (m_pConn !=  NULL) 

      // CLOSE没有? 要先Close
    m_pConn.Release(); 
    }
    注意顺序
      

  2.   


    m_pConn.Close();m_pConn = NULL;这样用即可。
      

  3.   

    不Release也行,SmartPointer会自动清理。
    总是遵循Open/Close原则进行操作......
      

  4.   

    先释放recordset,Connection最后再释放
    另看是否线程造成的阻塞
      

  5.   

    TO Elysuim:
       先释放recordset,Connection最后再释放,得出结果是一样:阻塞的.因为智能指针会自动释放Connection,不论你在程序里面是否显试调用Release函数,情况都是一样的:阻塞的.
      

  6.   

    会不会是两个线程同时操作一个m_pxxxxDb对象造成线锁:A线程正在使用m_pxxxxDb读取数据,而应用程序线程正在调用这上面的m_pxxxxDb面上的Release函数?
      

  7.   

    对STA对象中的对象的调用是按顺序进行的,是不能并发的,当杀死一个线程时,对象的调用将不会被返回,所以调用的STA中对象的下一个操作将等上一个操作的返回,线程一直被阻塞了.