我创建了一个ActiveX,在OnCreate事件中创建了两个线程。在OnDestroy事件中释放这两个线程。问题现象是有时候在调用一次ActiveX后再调用时,程序不执行OnCreate事件。我跟进去发现不成功调用的可能原因时第一次调用后OnDestroy执行时报一个错误(这个错误需要跟进去才能看到)The thread 0xBE0 has exited with code 1。查了查有人提到是内存泄漏造成的。请教各位高人帮我看看。相关代码如下:
int CPrinterCtrlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
{
return -1;
}
DWORD dwFailed = 0;
this->EditRegistry(&dwFailed); // 清空注册表里句柄值
DeleteAllFile(); // 删除所有已有图片的文件
pPrintThread = (CWinThread *)AfxBeginThread(_PrintThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create print thread
pPrinterSendThread = (CWinThread *)AfxBeginThread(_PrinterSendThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create socket thread
return 0;
}void CPrinterCtrlCtrl::OnDestroy()
{
COleControl::OnDestroy();
//ClearBeeSocket(&pPrinterSocket); // Clear the socket
_KillPrintThread(); // kill the thread
_KillPrinterSendThread(); // Kill the thread
}void _KillPrintThread()
{
DWORD dwStatus;
if(pPrintThread!=NULL)
{
//::WaitForSingleObject(pPrintThread->m_hThread,INFINITE);
::GetExitCodeThread(pPrintThread->m_hThread, &dwStatus);
if (dwStatus == STILL_ACTIVE)
{
// AfxEndThread(dwStatus, true);
delete pPrintThread;
}
pPrintThread = NULL;
}
}
int CPrinterCtrlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
{
return -1;
}
DWORD dwFailed = 0;
this->EditRegistry(&dwFailed); // 清空注册表里句柄值
DeleteAllFile(); // 删除所有已有图片的文件
pPrintThread = (CWinThread *)AfxBeginThread(_PrintThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create print thread
pPrinterSendThread = (CWinThread *)AfxBeginThread(_PrinterSendThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create socket thread
return 0;
}void CPrinterCtrlCtrl::OnDestroy()
{
COleControl::OnDestroy();
//ClearBeeSocket(&pPrinterSocket); // Clear the socket
_KillPrintThread(); // kill the thread
_KillPrinterSendThread(); // Kill the thread
}void _KillPrintThread()
{
DWORD dwStatus;
if(pPrintThread!=NULL)
{
//::WaitForSingleObject(pPrintThread->m_hThread,INFINITE);
::GetExitCodeThread(pPrintThread->m_hThread, &dwStatus);
if (dwStatus == STILL_ACTIVE)
{
// AfxEndThread(dwStatus, true);
delete pPrintThread;
}
pPrintThread = NULL;
}
}
你本来就是以挂起的方式创建的线程,
pPrintThread->ResumeThread();
...