SetTiemer(1,100,NULL)函数,
第一次调用OnTimer时,如果第一个100毫秒里在OnTimer消息函数里还没处理完的话,
然后又开始了调用第二次的OnTimer,这个时候,两次的这个OnTimer函数是不是
像多线程那样分开处理的。或者是其他的处理方式?

解决方案 »

  1.   

    关注。
    这种问题可以做个测试。OnTimer触发的时候打印一句log,
    里面处理 做个很大的循环,超过100ms的,循环结束再打印一句log,就可以看出来是什么样子的处理方式了。//本人么的环境进行测试
      

  2.   

    ontimer应该是只开一个线程的
    所以只能做一件事
    再来排队
      

  3.   

    SetTimer本质上是发送WM_TIMER的消息到窗口消息队列。队列消息是按先进先出的方式处理的,所以实际上第一个OnTimer没有处理完是不会开始第二个OnTimer的。当然,如果你在OnTimer里面建立一个新线程来处理任务的话,那另当别论。
      

  4.   

    void CTest_SetTimerDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    SetTimer(1,100,NULL);
    }void CTest_SetTimerDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    static int nNum = 0;
    static int nNum2 = 0;
    if (nIDEvent==1)
    {
    CString str;
    str.Format("%d",nNum);
    SetWindowText(str); Sleep(2000);
    nNum++;
    }

    CString str2;
    str2.Format("%d",nNum2);
    SetDlgItemText(IDC_BUTTON1,str2);
    nNum2++;
    CDialog::OnTimer(nIDEvent);
    }
      

  5.   


    SetTimer(1,100,NULL); 
    SetTimer(2,100,NULL); OnTimer(nIDEvent)
    {
    switch(nIDEvent)
    {
    case 1:
    //干什么
    break;
    case 2:
    //干什么
    break;
    }
    }
    Window会根据你的nIDEvent参数来决定那个。如果在一个定时程序结束之前就响应另一个,就需要多线程。
      

  6.   


    如果LZ是在第一个没结束的时候就开始调用了第二次的OnTimer的话,那就是多线程的处理。。
      

  7.   

    你的意思是 程序在OnTimer里还没执行完  又进了OnTimer函数?  自己觉得可能吗?(多线程另
    当别论)
      

  8.   

    不是的,我原以为SetTimer在设定的时间到了后,上一个OnTimer函数没执行完,
    就又会开始调用OnTimer,看来不是这样的