求救:类对象作为参数传入线程后,其指针类型的成员变为了NULL?
如下面程序。在ProducerThread中调用了类AdoOpDBMgr的成员SomeFunc()。在主线程中给ProducerThread传入了该类的初始化后的实例pDbMgr。但是在线程函数中一直出非法内存访问的错误。跟踪了一下,我发现原来是在子线程调用中,pDst和m_pConn等都变成了NULL。请问这是怎么回事?
class AdoOpDBMgr
{
public:
void SomeFunc();
......
private:
TADOConnection* m_pConn;
TADODataSet* pDst;
}
构造函数:
AdoOpDBMgr::AdoOpDBMgr(const String strConnString, const TDateTime sDt, const TDateTime eDt)
: iProd(0), iCons(1)
{
CoInitializeEx(NULL, 0);
m_pConn = new TADOConnection(NULL);
m_pConn->ConnectionString = strConnString;
try
{
m_pConn->Open();
}
catch(Exception &e)
{
ShowMessage(e.Message);
}
pDst = new TADODataSet(NULL);
pDst->Connection = m_pConn;
}
void SomeFunc()
{
// 在这个函数中会调用pDst和m_pConn等。但是跟踪发现它们在ProducerThread中时均为NULL。。。
}
线程函数:
void ProducerThread(LPVOID pParam)
{
printf("Starting producer thread...\n");
AdoOpDBMgr* pDbMgr = *((AdoOpDBMgr **)pParam);
while(pDbMgr->SomeFunc()){
;
}
}
主线程:
int _tmain(int argc, _TCHAR* argv[])
{
String strConn = "Provider=SQLOLEDB;SERVER=xxxx;DATABASE=xxxx;UID=sa;PWD=1";
DateTimeUtil sDt, eDt;
sDt.strDate = "20070104";
sDt.strTime = "93100";
eDt.strDate = "20120229";
eDt.strTime = "93500";
pDbMgr = new AdoOpDBMgr(strConn, sDt.GetTDateTime(), eDt.GetTDateTime());
HANDLE hProdThrd;
DWORD dwProdThrdId;
hProdThrd = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProducerThread, (LPVOID)&pDbMgr, 0, &dwProdThrdId);
CloseHandle(hProdThrd);
delete pDbMgr;
return 0;
}
[解决办法]
delete pDbMgr;干嘛,线程没有完毕呢,就delete pDbMgr了,那还不出错
首先确保线程结束,在delete