void CP_CDlg::Init()
{
this->m_pProducerThread =new CProducerThread(this);
this->m_pProducerThread->CreateThread(CREATE_SUSPENDED);
VERIFY(m_pProducerThread->SetThreadPriority(THREAD_PRIORITY_IDLE));
this->m_pProducerThread->ResumeThread();
}
int CProducerThread::Run()
{
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)m_pParentDlg;
CSingleLock mutexLock(pDlg->m_pMutex);
for(int i=0;i<MAX_DATA_COUNT;i++)
{
pDlg->m_pSemaphoreEmpty->Lock();
mutexLock.Lock();
pDlg->m_sBuf.Format("%0.10d",i);
mutexLock.Unlock();
pDlg->m_pSemaphoreFull->Unlock();
} return CWinThread::Run();
}
既然有new 就应该 有delete,如何添加?
{
this->m_pProducerThread =new CProducerThread(this);
this->m_pProducerThread->CreateThread(CREATE_SUSPENDED);
VERIFY(m_pProducerThread->SetThreadPriority(THREAD_PRIORITY_IDLE));
this->m_pProducerThread->ResumeThread();
}
int CProducerThread::Run()
{
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)m_pParentDlg;
CSingleLock mutexLock(pDlg->m_pMutex);
for(int i=0;i<MAX_DATA_COUNT;i++)
{
pDlg->m_pSemaphoreEmpty->Lock();
mutexLock.Lock();
pDlg->m_sBuf.Format("%0.10d",i);
mutexLock.Unlock();
pDlg->m_pSemaphoreFull->Unlock();
} return CWinThread::Run();
}
既然有new 就应该 有delete,如何添加?
在需要释放内存的时候(比如程序结束),WaitForSingleObject(hEvent),Wait成功之后删除CWinThread对象。
void CP_CDlg::OnDestroy()
{
delete this->m_pProducerThread;
//
CDialog::OnDestroy();
}
{
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)m_pParentDlg;
CSingleLock mutexLock(pDlg->m_pMutex);
for(int i=0;i<MAX_DATA_COUNT;i++)
{
pDlg->m_pSemaphoreEmpty->Lock();
mutexLock.Lock();
pDlg->m_sBuf.Format("%0.10d",i);
mutexLock.Unlock();
pDlg->m_pSemaphoreFull->Unlock();
} int r=CWinThread::Run();
delete this;
return r;}
你的代码会造成this->m_pProducerThread线程的非正常退出,可能导致不确定的问题。成熟的代码是不会这么写的。to Kevin_qing():
你的代码也许是可行的,但是违背了一个编码原则:谁分配谁负责。主线程很可能在不知情的情况下访问this->m_pProducerThread 而导致出错。
int CProducerThread::Run()
{
CP_CDlg *pDlg;
pDlg=(CP_CDlg*)m_pParentDlg;
CSingleLock mutexLock(pDlg->m_pMutex);
for(int i=0;i<MAX_DATA_COUNT;i++)
{
pDlg->m_pSemaphoreEmpty->Lock();
mutexLock.Lock();
pDlg->m_sBuf.Format("%0.10d",i);
mutexLock.Unlock();
pDlg->m_pSemaphoreFull->Unlock();
} int r=CWinThread::Run();
// send message to CP_CDlg to release the allocated memory
SendMessage(...); return r;}
{
if(m_pProducerThread != NULL)
{
delete pProducerThread ;
pProducerThread = NULL ;
}
return CProducerThread::ExitInstance();
}然后在
int CProducerThread::Run()
{
........
........
return ExitInstance();
//return CProducerThread::Run(); 这句原来的返回注释掉!
}
SendMessage出去,然后让外面来释放自己显然是不健康的。SendMessage的时候,ProducerThread线程还没退出,但是却要求其他线程释放自己,我想这必然导致其他线程释放一个还没结束的ProducerThread。用PostMessage也许会好一些,但是由于线程调度的不确定性,PostMessage也不是完全健康的。to jiuzhoulh:
你的解决方法和Kevin_qing的方法比较接近。也许都是可用的,但我想都不是最健康的。
对于关键代码,无论如何要保证代码的健康。非关键代码,可以适度考虑简洁的实现方法。PS:我做了整整四年的工业级应用软件,对于不健康代码带来的问题有切肤之痛。关于MFC,我觉得MFC本身其实很好的,只是要看在什么场合如何应用它。比如很多人说CString不好用,我想那只是在错误的场合错误的使用了CString。
那么线程结束时会自己delete this
比如threadWnd.Detach();
比如(*pThread->m_lpfnOleTermOrFreeLib)(TRUE, FALSE);delete之后也还有很多工作要做:
比如pThreadState->m_pToolTip->DestroyWindow();
比如delete pThreadState->m_pToolTip;
比如_afxThreadData->DeleteValues(hInstTerm, FALSE);
比如_endthreadex(nExitCode);这么多事情没做,居然还敢声称直接delete this是安全的?
我做开发3年来,一直不强调区分UI线程和工作线程,无意义,只会搞混思维,但有一个原则:所有的UI操作只放在一个线程处理.PS:楼主给的代码并非UI线程
蒙你的高见,实际上偶可以这样做,既然上面的线程由外面的进程来控制,那么当外面的进程想结束程序,那么可以先向线程发出一个信号(用全局bool型变量表示),当线程检测到该信号为真时,即处理其内部资源占用问题,处理完毕后退出线程,然后由外部的进程来处理上面的new,这样一来可以说安全的多。