void CTestDlg::OnTimer(UINT nIDEvent) 
{  if(nFlag != 1)
         {
  if (g_thFace != 0)
   WaitForSingleObject(g_thFace->m_hThread, 2000);
  else{}   if (g_thCam != 0)
     WaitForSingleObject(g_thCam->m_hThread, 2000);
  else{}
 
           g_thFace1=AfxBeginThread(threadFace1, this);
  g_thCam1=AfxBeginThread(threadCam1, this);
           nFlag = 1;
}

 else if(nFlag == 1)
          {
  
if (g_thFace1 != 0)
   WaitForSingleObject(g_thFace1->m_hThread, 2000);
else{} if (g_thCam1 != 0)
   WaitForSingleObject(g_thCam1->m_hThread, 2000);
else{}

          g_thFace=AfxBeginThread(threadFace, this);
 g_thCam=AfxBeginThread(threadCam, this);         nFlag = 2;
  } CDialog::OnTimer(nIDEvent);
}通过一个定时器来控制两组线程分别运行,以上写的有没有问题?WaitForSingleObject这个函数我看msdn帮助看的没怎么明白,是不是停止线程运行的函数?

解决方案 »

  1.   

    WaitForSingleObject等待某个对象,
    等待的时间为第二个参数。
    如果在这段时间内对象有信号,
    WaitForSingleObject返回,
    否则就阻塞在那里直到超时。
      

  2.   

    要OnTimer中等2s?UI响应?并且你不判断其返回值?
      

  3.   

    要OnTimer中等2s是为了看演示效果,“判断其返回值“我不明白,能具体说一下吗?
      

  4.   

    to :Pipi0714(小兔子):
    我是为了轮流执行两套线程,这样实现有什么问题吗?还有别的方法吗?
      

  5.   

    WaitForSingleObject是等待某一对象返回
    我不太明白你说的轮流执行是什么意思,你要是说你的4个线程依次轮流执行(也就是说不存在并发性)的话,这样写是不行的。需要用多线程互斥执行
      

  6.   

    要是两套线程轮流执行,等套完成后在执行另一套,你需要用到WaitForSingleObject的INFINITE参数
    可以将你的程序该为如下:
    void CTestDlg::OnTimer(UINT nIDEvent) 
    {  if(nFlag != 1)
             {
      if (g_thFace != 0)
       WaitForSingleObject(g_thFace->m_hThread, INFINITE);
      else{}   if (g_thCam != 0)
         WaitForSingleObject(g_thCam->m_hThread, INFINITE);
      else{}
     
               g_thFace1=AfxBeginThread(threadFace1, this);
       g_thCam1=AfxBeginThread(threadCam1, this);
               nFlag = 1;
    }

     else if(nFlag == 1)
              {
      
    if (g_thFace1 != 0)
       WaitForSingleObject(g_thFace1->m_hThread, INFINITE);
    else{} if (g_thCam1 != 0)
       WaitForSingleObject(g_thCam1->m_hThread, INFINITE)
    else{}

              g_thFace=AfxBeginThread(threadFace, this);
     g_thCam=AfxBeginThread(threadCam, this);         nFlag = 2;
      } CDialog::OnTimer(nIDEvent);
    }
      

  7.   

    不是另一套结束完,因为信号一直来。不可能结束的,所以必须让他强制结束,来进行第二套,如果改成
    WaitForSingleObject(g_thCam1->m_hThread, INFINITE)
    那么下一套进程就永远不能进去了