游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2393|回复: 2

定时器的问题

[复制链接]

15

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2012-3-7 10:51:00 | 显示全部楼层 |阅读模式
main中



_2nDs_Timer timer(1);
int time;
while (running)
{
     time = timer.GetTime();
     timer.WaitTime(16);
     int intime = timer.GetTime() - time;
     printf("time_delta : %d\n", intime);
}


定时器类


2nDs_Timer.h



#ifndef _2nDs_TIMER_H_
#define _2nDs_TIMER_H_
#include <windows.h>
class _2nDs_Timer
{
private:
    HANDLE hTimer;
public:
    _2nDs_Timer(BOOL bInit = FALSE);
    ~_2nDs_Timer(void);
    int CreateTimer(void); // 返回负数表示创建失败
    int DeleteTimer(int IId);
    BOOL IsExist(void);
    BOOL WaitTime(int Itime); // 毫秒
    int GetTime(void) {return (int)GetTickCount();}//毫秒
};
#endif



2nDs_Timer.cpp




#include "2nDs_Timer.h"

#if (defined _WIN32) || (defined _WIN64)
_2nDs_Timer::_2nDs_Timer(BOOL bInit)
{
    if (FALSE == bInit) hTimer = 0;
    else hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
}
_2nDs_Timer::~_2nDs_Timer(void)
{
    if (hTimer) CloseHandle(hTimer);
}
int _2nDs_Timer::CreateTimer(void)
{
    if (hTimer) return -3;
    hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    if (NULL == hTimer) return -1;
    return (int)hTimer;
}
int _2nDs_Timer:eleteTimer(int IId)
{
    if (NULL == hTimer) return -1;
    if (FALSE == CloseHandle(hTimer)) return -2;
    hTimer = 0;
    return 1;
}
BOOL _2nDs_Timer::IsExist(void)
{
    return (int)hTimer;
}
BOOL _2nDs_Timer::WaitTime(int Itime)
{
    if (NULL == hTimer) return -1;
    return (BOOL)WaitForSingleObject(hTimer, (DWORD)Itime);
}
#endif



不停显示time_delta : %d


数字显示 15,16倒是正常,但是间或的显示 31,32.。这是为啥呢?定时器也不准??

3

主题

29

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2012-3-7 17:06:00 | 显示全部楼层

Re:定时器的问题

你知道CPU的最小工作时间片段吗?
现在的CPU都是同时执行很多个线程,你这段代码在执行的时候,CPU也在穿插着执行其他线程。例如你的电脑在执行3个线程。
那么CPU 进入线程1,执行跑一段时间,然后进入线程2跑一段时间,最后进入线程3,然后继续这样循环。这样的好处是当某一个线程卡死后,CPU能并发的(其实是一种并发的假象,只是执行的很快,人类察觉不到)执行其他线程 从而不会导致整个电脑的所有程序全部卡死。
而在某一个线程里面具体执行多长时间就被称为最小时间片段。这个时间片段是根据CPU能力不同而决定的,并且时间也不是稳定的,会在一个大概的范围类波动。   
那么当某一次你的CPU执行到其他线程的时候,并且多耽误了一点时间,这时候你的定时器就会出现不准的情况,比如你上面出现的32 32

15

主题

38

帖子

38

积分

注册会员

Rank: 2

积分
38
 楼主| 发表于 2012-3-9 19:24:00 | 显示全部楼层

Re:定时器的问题

那应该怎么解决呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 16:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表