我在对话框中写了一个子程序,我想每隔50ms让他执行一次。如果用定时器来做,怎么做?还有没有其他的方法?
谢谢了,各位大侠!

解决方案 »

  1.   

    用MFC向导加WM_ONTIMER事件.
    void C***Dlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    case 1:
    //执行你的函数
    break;
    default:
    break;
    }
    CDialog::OnTimer(nIDEvent);
    }在别的地方[比如OnInitDialog()]
    SetTimer(1,50000,NULL);
      

  2.   

    使用wm_timer的消息
    再加定时器
      

  3.   

    还有自己做个线程,不断查询时间,隔一秒执行一次WM_TIMER阻塞时容易丢失消息
      

  4.   

    楼上说的差不多了。在ontimer中最好开新线程执行子程序。
      

  5.   

    建立一线程,线程函数中包括如下代码,就可以了。哈哈。
    while(1)
    {
    Sleep(50);
    yourfunction();
    }
      

  6.   

    按楼上说得试了,但它不执行子函数。我在OnTimer中给了一个前局变量,每执行一次它加1。
    我跟踪这个变量,它没变化。
      

  7.   

    请问在ontimer如何开一新线程?请大侠指教!
      

  8.   

    ontimer定时不是很准确,建议用线程自己控制。引用“kugou123(酷狗 闭关学习VC++) ”
    建立一线程,线程函数中包括如下代码,就可以了。哈哈。
    while(1)
    {
    Sleep(50);
    yourfunction();
    }
      

  9.   

    楼上说的方法可采用,yourfunction();的代码应该非常快地执行完
      

  10.   

    to:chinacao
        我子程序占用的时间比较多,就不会是“每隔”50ms执行一次。
      

  11.   

    可以使用多媒体定时器,以下是我以前用过的
    #include <MMSystem.h>
    #pragma comment(lib, "winmm.lib")
    DWORD m_dwad;
    UINT m_timerID;
    DWORD mtime;
    void   CALLBACK  TimeProc (UINT timerID ,UINT uMsg,
     DWORD dwUser, DWORD dw1, DWORD dw2 )
    {
    long num =0;
    num = mtime;
    mtime = timeGetTime();
    num = mtime - num;
    CString msg;
             msg.Format("%d",num);
    AfxMessageBox(msg);
    }
    LPTIMECALLBACK mTproc=TimeProc;
    TIMECAPS tc;
    UINT wTimerRes,DaTimer;
    if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR)
    {
    wTimerRes = min(tc.wPeriodMin, tc.wPeriodMax);
    }
        DWORD time = timeGetTime(); 
    timeBeginPeriod(100);

    if(DaTimer<tc.wPeriodMin) DaTimer=tc.wPeriodMin; m_timerID = timeSetEvent( 1000,
      wTimerRes,
      mTproc,
      m_dwad, TIME_PERIODIC);
      

  12.   

    一般WM_TIMER了.要讨论精确的话 响应WM_TIMER不行 消息堵塞不精确.sleep同样,它把时间片先让给别人.时间到了再回来,也不保证精确.总的来说用windows操作系统你就不可能做到精确的响应.因为windows不是实时操作系统.我是这样认为的.
      

  13.   

    是SetTimer(1, 50, NULL); //50ms
    一楼写成SetTimer(1, 50000, NULL);//50s
    所以楼主执行不了
      

  14.   

    chinacao(多多指教)?
    Sleep() 应放在后面,第一次执行时不用等待。
      

  15.   

    OnTimer ()事件 了    或者是 使用 Sleep ()  
    WINDOWs 同时支持 20 个时钟