void CProgressDlg::OnClose()
{
m_bEnd = true; DWORD ret = WaitForSingleObject(m_handle, INFINITE);
if(ret == WAIT_OBJECT_0)
{
CloseHandle(m_handle);
CDialog::OnCancel(); }}//等待这个这个函数结束,子线程的入口函数,它的句柄是m_handle,创建略。
void CProgressDlg::ProgressRun()
{
for(int i = 0; i<1000; i++)
{
if(m_bEnd)
{
return;
}
Sleep(10);
m_saveProgress.SetPos(i);
if(i ==999)
{
i = 0;
}
}
}
我用这种方式出了点问题。 但是那个线程结束的时候,线程对象确实变成有信号状态了嘛。

解决方案 »

  1.   

    用WaitForSingleObject(m_handle, INFINITE);
    来等待线程的结束。 是否可以?
      

  2.   

    啥问题?
    线程结束后的WaitForSingleObject的返回值貌似不是WAIT_OBJECT_0,具体可看看MSDN
      

  3.   

    WAIT_OBJECT_0
    0x00000000L The state of the specified object is signaled. MSDN上的
      

  4.   

    这个是正常状态下,既你的线程正在运行过程中,你通过SetEvent给线程句柄发个型号,那么返回的是WAIT_OBJECT_0,但是就你的情况而言,由于你得到信号时,线程已经退出,也就是说你的那个句柄可能已经失效,所以返回值并不一定是WAIT_OBJECT_0,可能是其他值
      

  5.   

    线程退出句柄就无效了么? 
    下面是windows核心变成的一段话,好像没看出来这么说。实际上,线程内核对象也遵循同样的 
    规则。即线程内核对象总是在未通知状态中创建。当线程终止运行时,操作系统会自动将线程 
    对象的状态改为已通知状态。因此,可以将相同的方法用于应用程序,以确定线程是否不再运 
    行。与进程内核对象一样,线程内核对象也可以处于已通知状态或未通知状态。 
      

  6.   

    WaitForSingleObject 函数可以用来等待线程结束的,参数放线程句柄就好了。
      

  7.   

    去掉 if(ret == WAIT_OBJECT_0),
    剩下的是可行的