国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

VB高精度計(jì)時(shí)器編程的討論

VB高精度計(jì)時(shí)器編程的討論

更新時(shí)間:2022-05-14 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

     VB記時(shí)器編程的討論 在很多場(chǎng)合下編程(例如工業(yè)控制、游戲)中需要比較精確的記時(shí)器,本文討論的是在VB下實(shí)現(xiàn)記時(shí)器的若干方法以及它們的精度控制問題。 在VB中最常用的是Timer控件,它的設(shè)置和使用都非常方便,理論上它的記時(shí)精度可以達(dá)到1ms(毫秒)。但是眾所周知的,實(shí)際上Timer在記時(shí)間隔小于50ms之下是精度是十分差的。它只適用于對(duì)于精度要求不太高的場(chǎng)合。 這里作者要介紹的是兩中利用Windows API函數(shù)實(shí)現(xiàn)精確記時(shí)的方法。第一中方法是利用高性能頻率記數(shù)(作者本人的稱呼)法。利用這種方法要使用兩個(gè)API函數(shù)QueryPerformanceFrequency和QueryPerformanceCounter。QueryPerformanceFrequency函數(shù)獲得高性能頻率記數(shù)器的震蕩頻率,該函數(shù)的定義如下:  

Private Declare Function QueryPerformanceFrequency Lib "kernel32" _
              (lpFrequency As LARGE_INTEGER) As Long
函數(shù)中的數(shù)據(jù)結(jié)構(gòu)LARGE_INTEGER定義如下:
Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

調(diào)用該函數(shù)后,函數(shù)會(huì)將系統(tǒng)頻率記數(shù)器的震蕩頻率保存到lpPerformanceCount中,其中低位保存到lowpart中,高位保存到highpart中。但是現(xiàn)在的Windows沒有使用到hightpart(系統(tǒng)頻率記數(shù)器的震蕩頻率與計(jì)算機(jī)的主頻無(wú)關(guān),我在幾臺(tái)機(jī)上做過驗(yàn)證,都是lowpart為1193180,highpart為0)。
QueryPerformanceCounter函數(shù)獲得系統(tǒng)頻率記數(shù)器的震蕩次數(shù),函數(shù)的定義如下

Private Declare Function QueryPerformanceCounter Lib "kernel32" _
        (lpPerformanceCount As LARGE_INTEGER) As Long

獲得記時(shí)器震蕩次數(shù)保存在lpPerformanceCount中。
顯然,如果首先獲得利用QueryPerformanceFrequency函數(shù)獲得頻率記數(shù)器的震蕩頻率,然后在執(zhí)行某個(gè)程序段之前調(diào)用QueryPerformanceCounter函數(shù)獲得頻率記數(shù)器的震蕩次數(shù),在程序段結(jié)束再調(diào)用QueryPerformanceCounter函數(shù)獲得頻率記數(shù)器的震蕩次數(shù),將兩次獲得的震蕩次數(shù)相減后再除以震蕩頻率就獲得的了兩次間隔之間的時(shí)間(以秒為單位)。如果在程序中建立一個(gè)循環(huán),在循環(huán)中不停的調(diào)用QueryPerformanceCounter獲得頻率記數(shù)器的震蕩次數(shù)并同先前的頻率記數(shù)器的震蕩次數(shù)相減,將結(jié)果除以頻率記數(shù)器的震蕩頻率,如果達(dá)到一定的時(shí)間就執(zhí)行某個(gè)任務(wù),這樣就實(shí)現(xiàn)了一個(gè)比較精確的記時(shí)器的功能。

另外的一種精確記時(shí)器的功能是利用多媒體記時(shí)器函數(shù)(這也是作者的定義,因?yàn)檫@個(gè)系列的函數(shù)是在Winmm.dll中定義并且是為媒體播放服務(wù)的)。
實(shí)現(xiàn)多媒體記時(shí)器首先要定義timeSetEvent函數(shù),該函數(shù)的定義如下:

Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
        uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, _
        ByVal uFlags As Long) As Long

函數(shù)定義中參數(shù)uDelay定義延遲時(shí)間,以毫秒為單位,該參數(shù)相當(dāng)于Timer控件的Interval屬性。參數(shù)uResolution定義記時(shí)精度,如果要求盡可能高的精度,要將該參數(shù)設(shè)置為0;參數(shù)lpFunction定義了timeSetEvent函數(shù)的回調(diào)函數(shù)的地址。參數(shù)dwUser定義用戶自定義的回調(diào)值,該值將傳遞給回調(diào)函數(shù)。參數(shù)uFlags定義定時(shí)類型,如果定義為Time_OneShot,則只會(huì)在當(dāng)達(dá)到uDelay定義的時(shí)間后調(diào)用回調(diào)函數(shù)一次,如果定義為TIME_PERIODIC,則在每次達(dá)到定時(shí)時(shí)間后調(diào)用回調(diào)函數(shù)。
如果函數(shù)調(diào)用成功,在系統(tǒng)中建立了一個(gè)多媒體記時(shí)器對(duì)象,每當(dāng)經(jīng)過一個(gè)uDelay時(shí)間后lpFunction指定的函數(shù)都會(huì)被調(diào)用。同時(shí)函數(shù)返回一個(gè)對(duì)象標(biāo)識(shí),如果不再需要記時(shí)器則必須要使用timeKillEvent函數(shù)刪除記時(shí)器對(duì)象。
由于Windows是一個(gè)多任務(wù)的操作系統(tǒng),因此基于API調(diào)用的記時(shí)器的精度都會(huì)受到其它很多因素的干擾。到底這兩中記時(shí)器的精度如何,我們來(lái)使用以下的程序進(jìn)行驗(yàn)證:
設(shè)置三種記時(shí)器(Timer控件、高性能頻率記數(shù)、多媒體記時(shí)器)。將它們的定時(shí)間隔設(shè)置為10毫秒,讓它們不停工作直到達(dá)到一個(gè)比較長(zhǎng)的時(shí)間(比如60秒),這樣記時(shí)器的誤差會(huì)被累計(jì)下來(lái),然后同實(shí)際經(jīng)過的時(shí)間相比較,就可以得到它們的精度。
下面是具體的檢測(cè)程序。
首先建立一個(gè)工程文件,在Form1中加入一個(gè)Timer控件,兩個(gè)CommandButton控件和三個(gè)TextBox控件,然后在Form1的代碼窗口中加入以下代碼


Option Explicit

Private Sub Command1_Click()
    Dim lagTick1 As LARGE_INTEGER
    Dim lagTick2 As LARGE_INTEGER
    Dim lTen As Long
     
    Command2.Enabled = True
    Command1.Enabled = False
    iCountStart = 60
    lmmCount = 60
    TimerCount = 60
    actTime1 = GetTickCount
    lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)
    Timer1.Enabled = True
     
    lTen = 10 * lMSFreq
    Call QueryPerformanceCounter(lagTick1)
    lagTick2 = lagTick1
    While iCountStart > 0
        Call QueryPerformanceCounter(lagTick2)
        '如果時(shí)鐘震動(dòng)次數(shù)超過10毫秒的次數(shù)則刷新Text1的顯示
        If lagTick2.lowpart - lagTick1.lowpart > lTen Then
            lagTick1 = lagTick2
            iCountStart = iCountStart - 0.01
            Text1.Text = Format$(iCountStart, "00.00")
        End If
        DoEvents
    Wend
End Sub

Private Sub Command2_Click()
    EndCount
End Sub

Private Sub Form_Load()
    Dim lim As LARGE_INTEGER
     
    Text1.Text = "60.00"
    Text2.Text = "60.00"
    Text3.Text = "60.00"
    Command1.Caption = "開始倒記時(shí)"
    Command2.Caption = "停止記時(shí)"
    Command2.Enabled = False
     
    '獲得系統(tǒng)板上時(shí)鐘頻率
    QueryPerformanceFrequency lim
     
    '將頻率除以1000就的出時(shí)鐘1毫秒震動(dòng)的次數(shù)
    lMSFreq = (lim.highpart * 2 ^ 16) \ 1000 + lim.lowpart \ 1000
    Timer1.Interval = 10
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    TimerCount = TimerCount - 0.01
    Text3.Text = Format$(TimerCount, "00.00")
    If TimerCount <= 0 Then
Timer1.Enabled = False
End If
End Sub
在Project中加入一個(gè)Module,然后在其中加入以下代碼:
Option Explicit

Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type

Public Declare Function QueryPerformanceCounter Lib "kernel32" _
(lpPerformanceCount As LARGE_INTEGER) As Long
Public Declare Function QueryPerformanceFrequency Lib "kernel32" _
(lpFrequency As LARGE_INTEGER) As Long
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal _
uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, _
ByVal uFlags As Long) As Long
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
Public Declare Function GetTickCount Lib "kernel32" () As Long

Public lMSFreq As Long
Public TimerCount As Single
Public lmmCount As Single
Public lTimeID As Long
Public actTime1 As Long
Public actTime2 As Long
Public iCountStart As Single

Dim iCount As Single

'timeSetEvent的回調(diào)函數(shù)
Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
ByVal dw1 As Long, ByVal dw2 As Long)

Form1.Text2.Text = Format$(lmmCount, "00.00")
lmmCount = lmmCount - 0.01
If lmmCount <= 0 Then
iCountStart = 60
lmmCount = 60
TimerCount = 60
EndCount
End If
End Sub
Sub EndCount()
iCount = iCountStart
iCountStart = 0
timeKillEvent lTimeID
actTime2 = GetTickCount - actTime1
With Form1
.Command1.Enabled = True
.Command2.Enabled = False
.Timer1.Enabled = False

.Text1 = "計(jì)數(shù)器記時(shí)" + Format$((60 - iCount), "00.00") + " " _
+ "實(shí)際經(jīng)過時(shí)間" + Format$((actTime2 / 1000), "00.00")
.Text2 = "計(jì)數(shù)器記時(shí)" + Format$((60 - lmmCount), "00.00") + " " _
+ "實(shí)際經(jīng)過時(shí)間" + Format$((actTime2 / 1000), "00.00")
.Text3 = "計(jì)數(shù)器記時(shí)" + Format$((60 - TimerCount), "00.00") + " " _
+ "實(shí)際經(jīng)過時(shí)間" + Format$((actTime2 / 1000), "00.00")
End With
End Sub


運(yùn)行程序,點(diǎn)擊“開始倒記時(shí)”按鈕開始倒記時(shí),可以看到兩種API記時(shí)器工作基本正常,文本框中的倒記時(shí)顯示流暢,而Timer控件的時(shí)間顯示相比之下卻不堪重負(fù),十分緩慢。按“停止記時(shí)”按鈕就可以停止倒記時(shí),由圖1可以看到,兩種API記時(shí)器的累計(jì)誤差在2‰以下,考慮到系統(tǒng)原因和處理記時(shí)顯示的時(shí)間,這個(gè)誤差基本是可以接受的,而且經(jīng)過作者的多次檢測(cè),誤差都在3‰以下。而Timer控件的誤差簡(jiǎn)直是無(wú)法接受的。

在運(yùn)行程序時(shí)作者還發(fā)現(xiàn)一個(gè)問題,如果在倒記時(shí)時(shí)拖動(dòng)窗口,文本框中的顯示都會(huì)停止,而當(dāng)停止窗口拖放后,多媒體記時(shí)器顯示會(huì)跳過這段時(shí)間記時(shí),而其它兩種記時(shí)器顯示倒記時(shí)卻還是從原來(lái)的時(shí)間倒數(shù)。這說明多媒體記時(shí)器是在獨(dú)立的線程中運(yùn)行的,不會(huì)受到程序的影響。

綜合上面的介紹和范例,我們可以看到,如果要建立高精度的記時(shí)器,使用多媒體記時(shí)器是比較好的選擇。而高性能頻率記數(shù)法比較適合計(jì)算某個(gè)耗時(shí)十分短的過程所消耗的時(shí)間(例如分析程序中某個(gè)被多次調(diào)用的程序段執(zhí)行時(shí)間以優(yōu)化程序),因?yàn)楫吘垢咝阅茴l率記數(shù)的理論可以達(dá)到微秒級(jí)別。Timer控件雖然精度比上面兩者差很多,但是它使用方便,在要求不高的場(chǎng)合它還是最佳選擇。
以上程序在Windows 98中文版,VB6下運(yùn)行通過。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        91丝袜美女网| 懂色av一区二区三区免费看| 亚洲成人你懂的| 91国产福利在线| 亚洲五月六月丁香激情| 欧美亚洲动漫精品| 日韩一区精品视频| 精品国产91亚洲一区二区三区婷婷| 秋霞av亚洲一区二区三| 精品福利一二区| 99久久精品免费精品国产| 亚洲国产一区视频| 欧美岛国在线观看| 不卡av在线免费观看| 水蜜桃久久夜色精品一区的特点| 精品乱码亚洲一区二区不卡| www.视频一区| 视频一区在线视频| 国产亚洲一区二区三区在线观看| 不卡一卡二卡三乱码免费网站| 香蕉av福利精品导航| 日韩一区二区精品葵司在线| 亚洲精品一区二区三区影院| 99久久婷婷国产综合精品| 婷婷六月综合亚洲| 国产欧美日韩精品在线| 欧美日韩一二三区| 成人黄动漫网站免费app| 日日摸夜夜添夜夜添亚洲女人| 欧美国产视频在线| 91精品国产高清一区二区三区| 99久久国产综合色|国产精品| 强制捆绑调教一区二区| 亚洲精品第1页| 国产精品久久久久久久蜜臀 | 丁香啪啪综合成人亚洲小说 | 国产精品毛片久久久久久久| 欧美一区二区女人| 日本道免费精品一区二区三区| 国内欧美视频一区二区| 日韩精品电影在线观看| 日韩美女视频一区| 欧美极品xxx| 久久老女人爱爱| 日韩亚洲欧美一区| 欧美精品久久久久久久久老牛影院| 波波电影院一区二区三区| 国产麻豆精品在线| 激情偷乱视频一区二区三区| 日日嗨av一区二区三区四区| 亚洲电影激情视频网站| 一区二区三区四区激情| 日韩毛片一二三区| 成人欧美一区二区三区视频网页 | 欧美老肥妇做.爰bbww视频| 不卡免费追剧大全电视剧网站| 国产成人免费在线观看| 国产精品羞羞答答xxdd| 国产成人免费视频一区| 国产成人aaaa| 国产不卡视频在线播放| 国产99久久精品| 成人av在线播放网址| av网站一区二区三区| 99久久久久久| 欧美在线视频全部完| 91成人在线精品| 欧美日韩三级视频| 日韩欧美色电影| 中文字幕av一区 二区| 日韩美女久久久| 午夜电影一区二区三区| 久久www免费人成看片高清| 国产久卡久卡久卡久卡视频精品| 国产成人av一区二区| 99热精品国产| 91精品蜜臀在线一区尤物| 精品久久人人做人人爽| 国产精品女同互慰在线看| 亚洲精品视频在线| 日日摸夜夜添夜夜添亚洲女人| 国模娜娜一区二区三区| 99久久er热在这里只有精品15| 在线观看www91| 久久人人超碰精品| 久久电影网站中文字幕| 国产精品久久久一区麻豆最新章节| 亚洲欧洲成人av每日更新| 一片黄亚洲嫩模| 日本在线播放一区二区三区| 国产一二精品视频| 在线一区二区三区四区| 日韩欧美的一区| 国产精品九色蝌蚪自拍| 日日夜夜一区二区| 成人禁用看黄a在线| 欧美色欧美亚洲另类二区| 26uuu国产一区二区三区| 亚洲乱码国产乱码精品精可以看| 七七婷婷婷婷精品国产| 高清av一区二区| 欧美一区日韩一区| 亚洲免费视频成人| 国产精品白丝jk白祙喷水网站| 色先锋aa成人| 亚洲精品一区二区三区四区高清| 一区二区三区四区亚洲| 国产99久久久精品| 日韩精品一区在线| 爽好久久久欧美精品| 成人国产一区二区三区精品| 日韩一区二区免费视频| 亚洲高清在线视频| 99精品国产一区二区三区不卡| 欧美成人r级一区二区三区| 亚洲国产精品人人做人人爽| 成人一道本在线| 精品久久久久久亚洲综合网 | 韩国一区二区三区| 51午夜精品国产| 亚洲午夜电影在线观看| 91免费版在线看| 亚洲欧洲日本在线| 国产91丝袜在线18| 久久久电影一区二区三区| 精品午夜一区二区三区在线观看| 欧美日韩在线播| 一区二区三区中文字幕在线观看| 成人黄色免费短视频| 中文av一区特黄| 99re在线精品| 一二三四社区欧美黄| 欧美在线不卡视频| 亚洲成人免费影院| 91.xcao| 奇米色一区二区| 久久亚洲精华国产精华液| 极品少妇xxxx偷拍精品少妇| 精品国产人成亚洲区| 国产精品一线二线三线| 在线91免费看| 一本色道久久综合亚洲aⅴ蜜桃| 国产日本一区二区| 成人一级黄色片| 亚洲品质自拍视频| 91国偷自产一区二区三区观看| 亚洲与欧洲av电影| 欧美日韩国产一级| 久久福利资源站| 国产精品国产三级国产aⅴ无密码| 不卡av在线网| 五月天亚洲婷婷| 久久久久99精品一区| 99国产欧美久久久精品| 亚洲成人av电影| 久久精品亚洲精品国产欧美kt∨| 99久久综合国产精品| 三级影片在线观看欧美日韩一区二区| 欧美一级免费大片| 成人午夜视频网站| 五月天激情综合| 国产日韩欧美精品一区| 在线精品视频一区二区三四| 久久超级碰视频| 一区二区三区在线免费观看| 精品国产乱码久久久久久闺蜜| 91免费观看视频在线| 精品一区二区免费| 一个色综合网站| 国产欧美一区二区三区网站| 欧美日韩高清一区二区不卡| 丁香婷婷综合激情五月色| 日韩 欧美一区二区三区| 国产精品麻豆欧美日韩ww| 欧美日韩一区二区三区视频| 国产白丝网站精品污在线入口| 亚洲国产精品久久不卡毛片 | 日韩免费视频一区| 91麻豆福利精品推荐| 久久国产精品一区二区| 亚洲一区二区三区在线播放| 国产日产精品1区| 日韩一级视频免费观看在线| 色欧美日韩亚洲| 高清成人在线观看| 久久99精品久久久| 婷婷开心激情综合| 亚洲精品v日韩精品| 国产精品国产精品国产专区不蜜| 欧美成人高清电影在线| 欧美日韩亚洲国产综合| 99久久国产综合精品色伊| 国产成人自拍网| 激情av综合网| 久久国产精品99精品国产| 日韩av午夜在线观看| 天堂影院一区二区| 亚洲成人免费av| 天天色天天操综合| 亚洲福利视频三区|