我在程序里有多个按钮,每个按钮都需要用一个定时器
CMyDlg::OnBut1()
{SetTimer(1,600,NULL)
}
CMyDlg::OnBut2()
{SetTimer(2,600,NULL)
}
响应时
CMyDlg::OnTimer(UINT   nIDEvent)     
  {   
    switch(nIDEvent){   
    case   1:   
      test1;   
      break;   
    case   2:   
      test2;   
      break;   
    }
CMyDlg::test1()
{
//做该做的事情
}
CMyDlg::test2()
{
//做该做的事情
}如果按下按钮1,响应test1,此时test1就一直在工作,这时还按下了按钮2响应test2,这时test2也会一直在工作吗?还是会有冲突,需要开多个线程?如果要开多个线程是在什么地方开比较好?在SetTimer前开,还是在OnTime的case里面开?

解决方案 »

  1.   

    还是开线程比较好,在OnBut1() 里开
      

  2.   

    你打开了定时器,其实它也是一个消息 WM_TIMER,所以,如果定时器开多的话,精度会很低,因为,响应一个定时器消息期间,是不能再去响应其它定时器消息的,只有本定时器消息处理完后,才能再次响应下一个 定时器消息。
      

  3.   

    如果按下按钮1,响应test1,此时test1就一直在工作,这时还按下了按钮2响应test2,这时test2也会一直在工作吗?还是会有冲突,
    =========
    定时器不过是定时发送消息,你开多个定时器,每个定时器都是到时间发消息,不过对定时器的响应一个是按顺序的,比如第一个定时器的test1() 未处理完,它是不会处理第二个定时器中的test2()的。另一个是,如果WM_TIMER来得太多,来不及处理,这些消息会被合并,所以很不准确,且运行时间越长越不准确。 
      

  4.   

    即使有定时器,程序还是在主线程里进行响应,不会同时执行多个CMyDlg::test1()。