程序退出如何结束线程,出现内存泄露!
程序退出如何结束线程?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();
}

解决方案 »

  1.   

    //::TerminateProcess(pThread->m_hThread,0);
    //CloseHandle(pThread->m_hThread);
    //delete pThread;
    -------
    为什么要用TerminateProcess? 
      

  2.   

    threadEnd.SetEvent();
    sleep(1000);  // 试试
    WaitForSingleObject(pThread->m_hThread,INFINITE);
      

  3.   

    ::TerminateProcess(pThread->m_hThread,0);
    要避免使用
      

  4.   

    while(!1)->while(1)强制结束线程是 TerminateThread,尽量不要强制结束
      

  5.   

    或者用一个全局变量比如,exit
    while(1)--->while(!exit)void CJanitorView::OnDestroy() 
    {
    ...
    exit=true;
    WaitForSingleObject(pThread->m_hThread,INFINITE);
    ...
    }
      

  6.   

    //初始化时
    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);