封装了一个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()操作,这样顺序执行的话,应该不会有阻塞才是啊。奇怪
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()操作,这样顺序执行的话,应该不会有阻塞才是啊。奇怪
解决方案 »
- 主线程里一个Dlg.DoModal()就可以显示,用AfxBeginThread调用就不行了?
- 多播WSAJoinLeaf 出错
- vc++操作ini文件,如何在指定路经生成ini文件。并且对字符串和数值数据进行读和写。
- 今天发现笔记本的网卡的MAC地址00-00-00-00-00-00,我不明白那笔记本如何和其他的计算机通信??
- 网络设置问题
- 怎么装msdn?
- 为什么???
- 有问题向各位高手请教?
- 如何在VC++ MFC单文档中显示多张BMP图片(利用DIB类)
- 高手请帮忙,关于HOOK.不能启动第二个钩子??
- 均衡器中各种类型(pop,jazz)中对各个频率的设置值有标准么
- 双击关联文件时,如何调用已经运行的程序实例打开该文件.
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();
}
注意顺序
m_pConn.Close();m_pConn = NULL;这样用即可。
总是遵循Open/Close原则进行操作......
另看是否线程造成的阻塞
先释放recordset,Connection最后再释放,得出结果是一样:阻塞的.因为智能指针会自动释放Connection,不论你在程序里面是否显试调用Release函数,情况都是一样的:阻塞的.