问个老问题  线程正在运行的时候  如果对话框关闭了 则把线程也关掉  这里怎么关闭线程呢?  
网上说用EVENT 和WaitForSingleObject   具体怎么用啊  谁给我个思路  说下步骤就行

解决方案 »

  1.   

    首先这个线程做什么样的工作,WaitForSingleObject 要放在合适的地方才有效。对话框关闭的时候也要等那个线程的句柄才算是真正的把资源释放了。
      

  2.   

    我原来是设了个人工事件Event m_erun7(true);UINT ThreadFunc7(LPVOID lpParam)
    {
         for(int i=0;i<pDlg->m_Damlist.GetItemCount();i++)   
        {
    WaitForSingleObject(m_erun7.m_hObject,INFINITE);
    …………
    }void CTimming::OnCancel() 
    {
    m_erun7.ResetEvent();
    CDialog::OnCancel();
    }但是这样关闭时程序还是出错了  请问我该怎么改
      

  3.   

    我是如下这般使用的HANDLE eventEnd = ::CreateEvent(NULL, FALSE, FALSE, NULL); // 通知线程退出
    HANDLE eventExit = ::CreateEvent(NULL, FALSE, FALSE, NULL); // 告知主线程我已退出UINT ThreadFunc7(LPVOID lpParam) 

        for(int i=0;i <pDlg->m_Damlist.GetItemCount();i++)  
        { 
    //“瞥”一眼,看一下eventEnd是否为有信号状态马上返回
    if(WAIT_OBJECT_0 == WaitForSingleObject(eventEnd,0))
    {
    ::SetEvent(eventExit);
    return 1; 
    }
    ………… 
    }
    return 0;
    } void OnCancel() 

    ::SetEvent(eventEnd);
    //这里有两种方案,一种是执著地等待线程返回
    ::WaitForSingleObject(eventExit,INFINITE)); /*
    //另一种是等一会儿,如果未返回就强行终止线程
    if(WAIT_TIMEOUT == WaitForSingleObject(eventExit,1000))
    {
    ::TerminateThread(m_pThread->m_hThread);
    }
    */

    CDialog::OnCancel(); 

      

  4.   

    UINT ThreadFunc7(LPVOID lpParam) 

        while(!bExit){ ... }} void CTimming::OnCancel() 

        bExit = TRUE;
        ::WaitForSingleObject(hThreadHandle,INFINITE));
        ...

      

  5.   

    一般用CloseHandle(hThread1);关闭线程句柄,线程运行完毕即可关闭;强行关闭
    ::TerminateThread(m_pThread->m_hThread);
      

  6.   

    这样比较简单的变相实现了Event