各位论坛的兄弟姐妹,我正在用Vs2008编一个东西,用到了计时器。大概代码如下:
CXXXDoc::OnGameNew()
{
    ...
    m_nTimerID = SetTimer(pView->GetSafeHwnd(), 1, 2000, CountDownFunc);
    代码A
}
void CALLBACK CXXXDoc::CountDownFunc(HWND hwnd ,UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    if()
    {
        ...
    }
    else
    {
        KillTimer(hwnd,idEvent);
    }}
我想在计时器结束以后开始执行代码A,请问代码A应该添加在什么地方(不能添加在KillTimer函数后面)。按照上面的写法肯定不行,计时器还没结束,代码A就开始执行了。问问各位朋友有没有什么好办法,麻烦告诉我一下。先谢谢了。

解决方案 »

  1.   

    我想在计时器结束以后开始执行代码A,请问代码A应该添加在什么地方(不能添加在KillTimer函数后面)。按照上面的写法肯定不行,计时器还没结束,代码A就开始执行了。问问各位朋友有没有什么好办法,麻烦告诉我一下。先谢谢了。
    ================
    楼主的想法有问题,windows是消息触发的,一般来说不需要用到上面这样的功能,不过一定要实现也可以,加一个bool变量,在A中判断,而在KillTimer后面对这个布尔值给TRUE值。
      

  2.   

    else 
        { 
            KillTimer(hwnd,idEvent); 
        } 
    在次发送一条消息去执行A代码
    不过我搞不明白为什么不能把A代码放在killTimer后面
      

  3.   

    不知道楼主是不是想在2000毫秒后执行A,如果是添加WM_TIMER的响应函数CXXXDoc::OnGameNew() 

        ... 
        m_nTimerID = SetTimer(1,1000,NULL);
        

    void CXXXDoc::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    if(nIDEvent==1)
    {
               KillTimer(1);//如果只执行一次代码A 的话           代码A 
    }
    CFormView::OnTimer(nIDEvent);
    }
      

  4.   

    我按照二楼的方法做了,加了个bool变量,还是马上就执行了。不是我想要的。
    wltg2001 说我的想法有问题,windows是消息触发的,你有什么好主意吗?是不是在KillTimer后给系统发送消息,把代码A放在消息响应函数中执行?
      

  5.   

    就该添加在KillTimer函数后面,不管是你要用变量控制还是直接写代码还是调用你的函数,就该。
      

  6.   

    CXXXDoc::OnGameNew() 

        CreateEvent(..);
        ... 
        m_nTimerID = SetTimer(pView->GetSafeHwnd(), 1, 2000, CountDownFunc); 
        if(WaitForSingleObject(...))  //等到了信号,开始执行
         {
          代码A 
         }

    void CALLBACK CXXXDoc::CountDownFunc(HWND hwnd ,UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 

        if() 
        { 
            ... 
            SetEvent(...);  //执行完毕,修改一个信号
        } 
        else 
        { 
            KillTimer(hwnd,idEvent); 
        } } 
      

  7.   

    个人认为还可以开子线程,在线程中用while循环等待标志位状态改变,改变后执行代码A 。在 KillTimer(hwnd,idEvent); 后将标志位改变
      

  8.   

    之所以我不想把代码A添加在KillTimer后面,是因为KillTimer在CountDownFunc()这个函数中调用的,CountDownFunc()这个函数我声明成static,这个函数无法调用普通类成员函数的,而代码A中可能会有许多类成员函数,所以代码A无法添加在KillTimer后面。
      

  9.   

    在KILLTIMER后SETTIMER,用另外一个计时器ID。
    在ONTIMER里面用SWITCH CASE。http://www.erbiano.cn
      

  10.   

    使用线程是一种不错的选择.
    你可以线程函数声明为友元形式的,enmu GameStatus
    { UNKNOW = 0,
      G_RUN,
      G_END
    }CXXXDoc::OnGameNew() 

        ... 
        m_nTimerID = SetTimer(pView->GetSafeHwnd(), 1, 2000, CountDownFunc); 
        m_runStaus = G_RUN;
        //创建线程 FucA

    void CALLBACK CXXXDoc::CountDownFunc(HWND hwnd ,UINT uMsg, UINT_PTR idEvent, DWORD dwTime) 

        if() 
        { 
            ... 
        } 
        else 
        { 
            KillTimer(hwnd,idEvent); 
            m_runStaus = G_END;//结束状态.
        } 

    FucA(LPVOID pParam)//声明为友元

      CXXXDoc * PDoc = (CXXXDoc)pParam
      while(PDoc->m_runStatus == G_END)
      { 
        //修改后的  代码A 
      }
    }
      

  11.   

    白天没时间上来,不好意思。
    biweilun的回复我现在仔细看了,觉得这也是一个解决办法,谢谢啦。