幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2801|回复: 3

[通用编程] 定时器也不准?

[复制链接]

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2012-3-7 10:22:55 | 显示全部楼层 |阅读模式
我后来也 提升了 线程和进程优先级。。。


class _2nDs_Timer

{

private:

HANDLE hTimer;

public:

_2nDs_Timer(unsigned char bInit = 0);

~_2nDs_Timer(void);

unsigned char CreateTimer(void); // 返回负数表示创建失败

unsigned char DeleteTimer(void);

unsigned char IsExist(void);

unsigned char WaitTime(int Itime); // 毫秒

unsigned int GetTime(void);//毫秒

};


_2nDs_Timer::_2nDs_Timer(unsigned char bInit)

{

DWORD dwCurrentProcessID = GetCurrentProcessId();

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCurrentProcessID);

DWORD dwCurrentThreadID = GetCurrentThreadId();

HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwCurrentThreadID);

if (hProcess)

printf("打开进程成功.
");

else

printf("打开进程失败.
");

if (hThread)

printf("打开线程成功.
");

else

printf("打开线程失败.
");

if (SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS))

printf("设置进程优先级成功.
");

else

printf("设置进程优先级失败.
");

if (SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL))

printf("设置线程优先级成功.
");

else

printf("设置线程优先级失败.
");



if (0 == bInit)

hTimer = 0;

else

hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

}


_2nDs_Timer::~_2nDs_Timer(void)

{

if (hTimer) CloseHandle(hTimer);

}


unsigned char _2nDs_Timer::CreateTimer(void)

{

if (hTimer) return 0x10;

hTimer = CreateWaitableTimer(NULL, FALSE, NULL);

if (NULL == hTimer) return 0x20;

return 1;

}


unsigned char _2nDs_Timer:eleteTimer(void)

{

if (NULL == hTimer) return 0x10;

if (FALSE == CloseHandle(hTimer)) return 0x20;

hTimer = 0;

return 1;

}


unsigned char _2nDs_Timer::IsExist(void)

{

if (hTimer)

return 1;

return 0;

}


unsigned char _2nDs_Timer::WaitTime(int Itime)

{

if (NULL == hTimer) return 0;

if (WaitForSingleObject(hTimer, (DWORD)Itime))

return 1;

return 0;

}


unsigned int _2nDs_Timer::GetTime(void)

{return (UINT)GetTickCount();}


main中


_2nDs_Timer timer(1);

while(1)

{

time = timer.GetTime();

timer.WaitTime(16);

int intime = timer.GetTime() - time;

printf("time_delta : %d
", intime);

}


结果。。。


15

16

15

16


就是15 或者16


但是 timer.WaitTime(16);

就会显示


31

32

31

32


就是 32或者31


timer.WaitTime(8);


0、15、16都有可能。。。


是CPU中断频率的作用么??
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-3-11 23:38:44 | 显示全部楼层
UP。。。。
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

24

主题

117

帖子

1274

积分

⑥精研

积分
1274
QQ
发表于 2012-3-23 16:30:35 | 显示全部楼层
用QueryPerformanceCounter和QueryPerformanceFrequncy做计时器吧,这是CPU时间,100%准确的 -w-
Tamashii是啥意思? 魂! ======================= 我真是败给C++的面向对象了啊……
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-3-23 20:46:11 | 显示全部楼层
QueryPerformanceCounter和QueryPerformanceFrequncy可以让进程不占用CPU不?

一个是计数,一个是频率,难道要死循环做判断?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 22:17 , Processed in 0.020882 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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