读书人

:类对象作为参数传入线程后其指针类

发布时间: 2012-04-25 19:32:32 作者: rapoo

求救:类对象作为参数传入线程后,其指针类型的成员变为了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

读书人网 >C++

热点推荐