程序是这样的:
Start() ,启动一个线程
{
   while(1)
{
         执行其他代码   if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
break;
}
  ResetEvent(KillEvent);}
Stop() 关闭线程
{
  SetEvent(KillEvent);
  While (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0 )
        Sleep(5);
  
}一个start按钮调用start(), 一个stop按钮调用stop(), 当不停地循环点击这两个按钮时,程序会没响应,鼠标变成漏斗形状。 这种情况只在很快的机器上发生, 在慢的机器上不会出现。

解决方案 »

  1.   

    不是死锁,应该是WaitForSingleObject(m_hKillEvent, 0)没有返回
    WAIT_OBJECT_0
    死循环!!!!!
      

  2.   

    如果连续的start,产生2个以上的工作线程的时候,点击stop,其中一个线程break后,执行ResetEvent(KillEvent);那么另外一个线程执行if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)就不会break了,还会继续运行。
      

  3.   

    我说的不是很清楚,应该是这样一个过程,不停地start()---stop()这样一个组合,不会跑出两个线程
      

  4.   

    http://www.blogcn.com/user3/jiangsheng/main.asp?id=702086
      

  5.   

    我怀疑是你没有等待上一个线程结束,就开始一个新线程。这样改一下试试start()
    {
        // m_hThread 在构造函数中赋NULL
        if(m_hThread != NULL)
        {
    ::WaitForSingleObject (m_hThread, INFINITE);
    ::CloseHandle (m_hThread);
    m_hThread = NULL;
        }    CWinThread* pThread = AfxBeginThread (ThreadFunc, ptp,
    THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);    ::DuplicateHandle (GetCurrentProcess (),
    pThread->m_hThread, GetCurrentProcess (), &m_hThread,
    0, FALSE, DUPLICATE_SAME_ACCESS);    pThread->ResumeThread();    ……
    }
      

  6.   

    不会的,因为每次start()之前都会调stop()的
    而stop()只有在线程结束之后才会返回
      

  7.   

    程序是这样的:
    Start() ,启动一个线程
    {
       while(1)
    {
             执行其他代码   if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
    break;
    }
      ResetEvent(KillEvent);}
    Stop() 关闭线程
    {
      SetEvent(KillEvent);
      While (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0 )
            Sleep(5);
      
    }怎么set的都是KillEvent,wait的都是m_hKillEvent。你要写的是这种吧Start() ,启动一个线程
    {
       while(1)
    {
             执行其他代码   if (WaitForSingleObject(m_hKillEvent, 0) == WAIT_OBJECT_0)
    break;
    }
      SetEvent(KillEvent);}
    Stop() 关闭线程
    {
      SetEvent(m_hKillEvent);
      While (WaitForSingleObject(KillEvent, 0) == WAIT_OBJECT_0 )
            Sleep(5);
      
    }
      

  8.   

    理解错了,你是要启动一个线程之前终止前一个线程。这种办法比较保险,在发出信号后永久等待该线程的终止。m_hThread本身就可作为一种信号。
    ::WaitForSingleObject (m_hThread, INFINITE);
    ::CloseHandle (m_hThread);
    m_hThread = NULL;
      

  9.   

    WaitForSingleObject应该无限制的等待实践激活才继续执行后面的代码。
    //if (WaitForSingleObject(m_hKillEvent,INFINITE)==WATI_OBJECT_0)楼主用WaitForSingleObject(m_hKillEvent,0),那么Start里会直接跳过break。线程进入死循环。
    同理,Stop中的WaitForSingleObject也用INFINITE。
    Start()
    {
      while(1){
        if (WaitForSingleObject(m_hKillEvent,INFINITE)==WAIT_OBJECT_0){ //此处等待事件
           break;
        ...//线程执行代码
      }
    }
    stop()
    {
       SetEvent(m_hKillEvent);
      //不用再WaitForSingleObject 事件了吧。
      WaitForSingleObject(m_hMyThread,INFINITE);
      CloseHandle(m_hMyThread);
    }
            
      

  10.   

    楼上各位,我感觉线程的机制应该没问题,有可能我线程里的执行代码导致没响应to 楼上:
     如果按你的说法,线程里只有在stop()被调用之后才会执行线程的代码,这样逻辑上是有问题的吧。
      

  11.   

    TO wangbab(bab)start里也无限制的等待,“线程执行代码”还会执行吗?