我在程序开发中,一直感觉到如果Sleep中设置的时间长,我的程序半天就没有反应了,我需要一边延时,同时程序还能反映,感觉Sleep太不好用了!
我的程序需要很多计时器,我用的都是OnTimer,但是我感觉程序在运行过程中特别乱,我想不用OnTimer也能实现计时功能!大家给点意见,用什么方法可以代替Sleep和OnTimer的作用啊?

解决方案 »

  1.   

    只有多线程了,我同你的情况一样,Sleep使用的好像是没有反应了,还是经常的死机.
      

  2.   

    sleep会使你的主线程停止,最好开个工作线程
      

  3.   

    不要在主界面线程里 使用sleep 函数 那样会让你的程序像死了一样 
    最好是使用定时器 用 ontimer 让他流逝 指定的时间就行了啊
      

  4.   

    dwStart=floor(GetTickCount()*4)/4+1000;  //延时一秒
    do

       PeekMessage(&msg,NULL,0,0,PM_REMOVE);   //转发消息
       if (msg.message ==WM_QUIT)
             return FALSE;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
       dwStop=GetTickCount();
    }while(dwStop<dwStart);
      

  5.   

    噢!太长时间不要这样,cpu会100%占用,但程序不会象死了一样,其它程序也正常
      

  6.   

    试试加以下函数:
    void DoEvents(DWORD ms)
    {
    MSG msg;
    int count=ms/100;
    for(int i=0;i<count;i++)
    {
    while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    Sleep(100);
    }
    }
    并将Sleep(...);换成DoEvents(...);
      

  7.   

    还有个方法能代替Sleep(),
    你的目的只是让OnTimer()暂停一下执行,
    你可以先定义一个变量:int a=0;//全局的,在OnTimer()外,
    然后
    void CMyQQDlg::OnTimer(UINT nIDEvent) 
    {
             if(nIDEvent==1)//处理定时器1
                {
                      if(a%1000==0)//当计数达到1000时再处理
                        //..do something here
                     a++;
                 }
    CDialog::OnTimer(nIDEvent);
    }
      

  8.   

    大家说的很好,谢谢大家,其实我的目的主要是为了找到更好的办法替换掉Sleep和OnTimer,因为我刚做的程序,用到了很多的Sleep和OnTimer,感觉程序很不稳定,所以才有了这个想法,我觉得Sleep的计时程序可以在线程中使用,这样不会影响主进程,但我还是没有想到如何替换SetTimer的功能,因为我有些功能必须在主进程中通过计时的功能来实现,所以我想找一个能够替换OnTimer的方法,大家有什么方法呢?
      

  9.   

    WaitTimeForSingleObject(..,dwTime);
    dwTime是等待的时间。
      

  10.   

    主进程里面使用多个WaitTimeForSingleObject会不会有影响啊,会不会造成程序暂停的想象啊?
      

  11.   

    用一个timer,设置一个timeline的机制如何?
      

  12.   

    我觉得实现这个Timer的机制,还是用一个线程,这个线程来监控原来需要调用SetTimer的函数,如果时间到就给主进程发一个消息,当然要能够发送多个消息,因为可能主进程有多个需要计时的地方,这是我的想法,大家觉得怎么样,希望大家多多讨论!