当前位置: 行情首页 >> 技术文章 >> 技术文章 >> 急!VC中怎样加定时器与后台运行

  • 急!VC中怎样加定时器与后台运行的Thread中? VC/MFC / 基础类
  • 2007-10-22 10:01:37 杭州电脑数码城 转载来源:csdn.net
  • 社区 - VC/MFC / 基础类

    急!VC中怎样加定时器与后台运行的Thread中?

    () 2000-03-01 14:50:00在 VC/MFC / 基础类 提问

    VC中要加一个后台定时检测的Thread,请问各路豪杰,有什么好办法?
    Thanks!
    问题点数:50、回复次数:15

    1楼 snakebird () 回复于 2000-03-01 15:17:00 得分 0


    用CreateThread建立一个线程
    在线程中用GetTickCount自己做循环计时,这样比用定时器好。


    2楼 () 回复于 2000-03-01 15:24:00 得分 0


    GetTickCount()放在 OnIdle消息下吗?

    3楼 WHQ () 回复于 2000-03-01 15:33:00 得分 20


    循环检测太耗CPU了,还是在检测的线程中等待一个永不发生的事件,并把超时设为你期望的时间比较好:

    DWORD WINAPI DetectThreadProc(LPVOID lpParam)
    {
    HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    DWORD dwTimeOut = 60000; // 你期望的时间间隔
    DWORD dwDelay = 0;
    while( !bFinish )
    {
    DWORD dwLoopStart = GetTickCount();
    WaitForSingleObject(hEvent, dwTimeOut-dwDelay);
    ...
    dwDelay = GetTickCount()-dwLoopStart; // 补偿检测处理所花的时间
    }
    }

    4楼 () 回复于 2000-03-01 16:01:00 得分 0


    请问WHQ,后台进程要不断地等待每隔TimeOut 后所触发的消息,应怎样处理?

    5楼 forgettor () 回复于 2000-03-01 17:12:00 得分 0


    关注

    6楼 cdzhd () 回复于 2000-03-01 17:25:00 得分 0


    用用户线程代替工人线程

    7楼 deepwater () 回复于 2000-03-01 17:54:00 得分 0


    首先肯定不能用循环的方法,否则在95/98这种非真正独占式操作系统中会严重降低系统性能,我在去年一个 very time critical 的项目中碰到了精确到1毫秒的要求,我用的是
    Multimedia Timers.
    Multimedia Timers的详情可以从MSDN中查到,它是通过设定分辨率后,按你要求的时间定期调用你的回调函数,你只需先创建一个全局的事件,然后在你的回调函数每次被调用时signal此事件.同时在你的后台运行的Thread中WaitForSingleObject此事件即可.一旦WaitForSingleObject返回WAIT_OBJECT_0,则你等到时间了.记住在这儿把你的全局的事件unsignal再继续

    8楼 snakebird () 回复于 2000-03-01 18:09:00 得分 0


    在循环中加一句:
    Sleep(1);
    就可以降低后台循环检测线程对CPU的占用率。

    9楼 repus () 回复于 2000-03-01 18:37:00 得分 0


    使用多媒体定时器timeSetEvent,它运行于自己的线程中,刚好符合你的后台定时器要求。

    10楼 alanlee () 回复于 2000-03-02 16:55:00 得分 0


    建议开启界面线程使其拥有自己的消息队列,在其中建立定时器并编写定时器调用代码,
    然后发消息到你自己的主线程的消息队列中。

    11楼 WHQ () 回复于 2000-03-02 18:28:00 得分 0


    我写的那段代码不已处理了吗?你看一个WaitForSingleObject函数的说明就明白了

    12楼 panxi (一天到晚游泳的鱼) 回复于 2000-06-29 10:35:00 得分 30


    这很简单,我的程序里是这么用的:

    UINT IDOfTimer=::SetTimer(NULL,1,1000*2,TimerProc);
    注意第一个参数为NULL

    void CALLBACK TimerProc(
    HWND hwnd,
    UINT uMsg,
    UINT idEvent,
    DWORD dwTime )
    {}

    千万不要用循环,如果你使用循环,你马上就会耗尽CPU
    结果就是死机
    我的这段代码工作的很好,消耗的CPU极少

    13楼 abentu () 回复于 2000-06-29 11:42:00 得分 0


    WaitForSingleObject不如Sleep
    顺便提醒一下,win9x中的缺省定时器间隔约50ms。

竟价广告:

    业界行情新闻声明事项:

    • ☉本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性!
    • ☉如其他媒体、网站或个人从本网下载使用,必须保留本网注明的“稿件来源”,并自负版权等法律责任。如对稿件内容有疑议,请及时与我们联系.
    • ☉如本网转载稿涉及版权等问题,请作者在速来电或来函与杭州电脑数码城网联系.
    • ☉本站网址:http://www.ititt.com/投诉邮箱:6371222@qq.com