一种取得Windows系统运行时间,且不同于GetTickCount的方法

贝隆 2009-09-04 11:02:57
加精
Windows系统的应用程序编程接口函数(API)都是使用C/C++语言编写的,VB中使用系统API函数需要改写声明。
GetiTickCount函数的含义是:取得自Windows系统启动以来到现在所经过的时间(单位:ms)。
在VB6.0中,API函数:
GetTickCount的声明如下:Private Declare Function GetTickCount Lib "kernel32" () As Long
在Windows中,该函数的原型是:DWORD GetiTickCount

我们可以发现在VB系统下,Gettickcount返回的是Long类型,长4个字节,而在WIndows下,GetTickCount返回的是DWORD类型,长4个字节的无符号数据类型。DWORD类型的数据范围是:0 ~ 2^32。
Long类型的数据范围是:-2147483648~2147483647,作为GetTickCount函数的返回值,只能是:0~2147483647,经过计算大约是:24.86天,也就是说,使用VB编制的系统在使用了24.86天以后,使用GetTickCount读回来的值就是负数了!具体原因请参考:http://topic.csdn.net/u/20090708/20/c2d2370d-d506-441e-b3c0-5aa3a6bcd566.html

最近我偶然间发现一个高人提供的一个方法,感觉能弥补VB中GetTickCount函数的不足。代码如下:
Option Explicit
Private Declare Function osQueryPerformanceCounter Lib "kernel32" Alias "QueryPerformanceCounter" _
(lpPerformanceCount As Currency) As Long
Private Declare Function osQueryPerformanceFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" _
(lpFrequency As Currency) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'函数功能:计算Windows自启动以来所经历的时间(s)
'返回类型:Double类型,你可以修改它,也可以返回整形。
'
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Public Function Timer() As Double
Dim freq As Currency
Dim count As Currency
On Error GoTo errFun
osQueryPerformanceFrequency freq '频率 相当于速度 v
osQueryPerformanceCounter count '已发脉冲数 相当于距离 s
Timer = count / freq '计算时间 t=s/v
Exit Function
errFun:
Timer = 0
End Function

Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
Timer1.Enabled = True
Timer1.Interval = 1000
End Sub
'%%%%%%%%%%%%%%%%%%%%%%
'过程功能:使用两个方法计算系统启动时间,实际测试,两者值有点误差。
'
'%%%%%%%%%%%%%%%%%%%%%%%
Private Sub Timer1_Timer()
Text1.Text = Timer
Text2.Text = GetTickCount * 0.001
End Sub
...全文
4464 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
surepretty 2009-09-10
  • 打赏
  • 举报
回复
要顶!!
贝隆 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 96 楼 sulipeng007 的回复:]
long负数只是vb没有dword的概念,当long数据的4个字节共32位中的最高位为1时,vb就显示为负的,而且此时值是为该负数的补码,如果你需要dowrd值,那么在vb中定义一个能包含dword数据范围的数据类型,如currency,然后直接用“&H100000000+long负值”就可以得到dword表示的正值了。

[/Quote]

这个我知道。谢谢
meggie34 2009-09-09
  • 打赏
  • 举报
回复
学习学习~~~~
打死不掉牙 2009-09-09
  • 打赏
  • 举报
回复
long负数只是vb没有dword的概念,当long数据的4个字节共32位中的最高位为1时,vb就显示为负的,而且此时值是为该负数的补码,如果你需要dowrd值,那么在vb中定义一个能包含dword数据范围的数据类型,如currency,然后直接用“&H100000000+long负值”就可以得到dword表示的正值了。
ccc_moriya 2009-09-09
  • 打赏
  • 举报
回复
新手上路
maymaaiyong 2009-09-09
  • 打赏
  • 举报
回复
.................帮顶.
caixiaobai08 2009-09-09
  • 打赏
  • 举报
回复
o
tiger_ok1 2009-09-09
  • 打赏
  • 举报
回复
《深入理解计算机系统》值得一看..
wangmashisan 2009-09-09
  • 打赏
  • 举报
回复
写得很好
呵呵
嗷嗷叫的老马 2009-09-09
  • 打赏
  • 举报
回复
靠.
嗷嗷叫的老马 2009-09-09
  • 打赏
  • 举报
回复
分页.
布衣散人 2009-09-09
  • 打赏
  • 举报
回复
100
zzh570060189 2009-09-09
  • 打赏
  • 举报
回复
dasgfhgdfdh
felixcao_2003 2009-09-08
  • 打赏
  • 举报
回复
感谢楼主分享。
东方之珠 2009-09-08
  • 打赏
  • 举报
回复
高精度计数器,我已经玩过了。不过,陈辉说的NtQuerySystemInformation,还没有玩过,今天回去玩玩!
qy300 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 r_swordsman 的回复:]
负数你完全可以转换为正确的大整数..还这么麻烦?
[/Quote]支持。
嗷嗷叫的老马 2009-09-08
  • 打赏
  • 举报
回复
```````````````````````````````````````
贝隆 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 88 楼 supconsupcon 的回复:]
在多核情况下时间可能会计算得不准的,osQueryPerformanceCounter 取的是一个晶振震动的次数,
但是有可能会出现一个核与其它核的晶振震动次数不一致的情况,这时计算就会出现问题,具体原因MSDN
上有解释的,所以用这两个函数时,一定要将进行记时的线程绑定到某个CPU上,绑定的API函数是:SetThreadIdealProcessor,很多网游的服务器和客户端的时间同步模块都会有这样的规定的
[/Quote]
学习
贝隆 2009-09-08
  • 打赏
  • 举报
回复
.......................
wym2199 2009-09-08
  • 打赏
  • 举报
回复
留意老马 好久了 呵呵 iam begginer,but not gay,,
加载更多回复(85)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧