程序退出如何结束线程,出现内存泄露!
程序退出如何结束线程?CWinThread *pThread; //线程对象 全局
CEvent threadStart,threadEnd;//线程开始结束对象 全局UINT ThreadReadComm(LPVOID lParam)
{
::WaitForSingleObject(threadStart.m_hObject,INFINITE);
AfxMessageBox("Thread start.");
CJanitorView* p=(CJanitorView *)lParam;
while(!1)
{
Sleep(500);
Beep(100,100);
//等待threadEnd事件有信号,无信号时线程在这里悬停
int result=::WaitForSingleObject(threadEnd.m_hObject,0);
if(result==WAIT_OBJECT_0)
{
AfxMessageBox("Thread End.");
break;
} }
return 0;
}
void CJanitorView::OnInitialUpdate()
{
...
threadStart.SetEvent();//threadStart事件有信号
pThread=AfxBeginThread(ThreadReadComm,this);//启动线程
pThread->m_bAutoDelete=false; //线程为手动删除
...
}void CJanitorView::OnDestroy()
{
//删除线程
//以下语句能完成退出程序但 出现内存泄露
//::TerminateProcess(pThread->m_hThread,0);
//CloseHandle(pThread->m_hThread);
//delete pThread; //以下语句不能完成退出程序
threadEnd.SetEvent();
WaitForSingleObject(pThread->m_hThread,INFINITE);
delete pThread;
FreeLibrary(hInst_Card);//释放动态库资源
CFormView::OnDestroy();
}
程序退出如何结束线程?CWinThread *pThread; //线程对象 全局
CEvent threadStart,threadEnd;//线程开始结束对象 全局UINT ThreadReadComm(LPVOID lParam)
{
::WaitForSingleObject(threadStart.m_hObject,INFINITE);
AfxMessageBox("Thread start.");
CJanitorView* p=(CJanitorView *)lParam;
while(!1)
{
Sleep(500);
Beep(100,100);
//等待threadEnd事件有信号,无信号时线程在这里悬停
int result=::WaitForSingleObject(threadEnd.m_hObject,0);
if(result==WAIT_OBJECT_0)
{
AfxMessageBox("Thread End.");
break;
} }
return 0;
}
void CJanitorView::OnInitialUpdate()
{
...
threadStart.SetEvent();//threadStart事件有信号
pThread=AfxBeginThread(ThreadReadComm,this);//启动线程
pThread->m_bAutoDelete=false; //线程为手动删除
...
}void CJanitorView::OnDestroy()
{
//删除线程
//以下语句能完成退出程序但 出现内存泄露
//::TerminateProcess(pThread->m_hThread,0);
//CloseHandle(pThread->m_hThread);
//delete pThread; //以下语句不能完成退出程序
threadEnd.SetEvent();
WaitForSingleObject(pThread->m_hThread,INFINITE);
delete pThread;
FreeLibrary(hInst_Card);//释放动态库资源
CFormView::OnDestroy();
}
//CloseHandle(pThread->m_hThread);
//delete pThread;
-------
为什么要用TerminateProcess?
sleep(1000); // 试试
WaitForSingleObject(pThread->m_hThread,INFINITE);
要避免使用
while(1)--->while(!exit)void CJanitorView::OnDestroy()
{
...
exit=true;
WaitForSingleObject(pThread->m_hThread,INFINITE);
...
}
HANDLE m_hKillThreadEvent; // ֪ͨ×ÓÏ̹߳رյÄʼþ
HANDLE m_hThreadKilledEvent; // ×ÓÏß³ÌÐû¸æ¹Ø±ÕµÄʼþ
//全局函数
{
while(1)
{
DWORD dwEvent = WaitForSingleObject(p->m_hKillThreadEvent, 0);
if (dwEvent == WAIT_OBJECT_0)
break;
Sleep(700);
.
.
.}
SetEvent(p->m_hThreadKilledEvent);
return 0
}
//结束时
SetEvent(m_hKillThreadEvent);
WaitForSingleObject(m_hThreadKilledEvent, INFINITE);
CloseHandle(m_hKillThreadEvent);
CloseHandle(m_hThreadKilledEvent);