大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> VB高精度计时器编程的讨论

VB高精度计时器编程的讨论

时间: 2021-07-31 作者:daque

     vb倒计时器编制程序的计划 在很多场所下编制程序(比方产业遏制、游戏)中须要比拟透彻的倒计时器,正文计划的是在vb下实行倒计时器的几何本领以及它们的精度遏制题目。 在vb中最常用的是timer控件,它的树立和运用都特殊简单,表面上它的倒计时精度不妨到达1ms(毫秒)。然而妇孺皆知的,本质上timer在记功夫隔小于50ms之下是精度是格外差的。它只实用于对于精度诉求不太高的场所。 这边作家要引见的是两中运用windows api因变量实行透彻倒计时的本领。第第一中学本领是运用高本能频次记数(作家自己的称谓)法。运用这种本领要运用两个api因变量queryperformancefrequency和queryperformancecounter。queryperformancefrequency因变量赢得高本能频次记数器的振动频次,该因变量的设置如次:  private declare function queryperformancefrequency lib "kernel32" _               (lpfrequency as large_integer) as long 因变量中的数据构造large_integer设置如次: type large_integer     lowpart as long     highpart as long end type 挪用该因变量后,因变量会将体例频次记数器的振动频次生存到lpperformancecount中,个中低位生存到lowpart中,上位生存到highpart中。然而此刻的windows没有运用到hightpart(体例频次记数器的振动频次与计划机的主频无干,我在几台机上做过考证,都是lowpart为1193180,highpart为0)。 queryperformancecounter因变量赢得体例频次记数器的振动度数,因变量的设置如次 private declare function queryperformancecounter lib "kernel32" _         (lpperformancecount as large_integer) as long 赢得倒计时器振动度数生存在lpperformancecount中。 明显,即使开始赢得运用queryperformancefrequency因变量赢得频次记数器的振动频次,而后在实行某个步调段之前挪用queryperformancecounter因变量赢得频次记数器的振动度数,在步调段中断再挪用queryperformancecounter因变量赢得频次记数器的振动度数,将两次赢得的振动度数相减后再除以振动频次就赢得的了两次间隙之间的功夫(以秒为单元)。即使在步调中创造一个轮回,在轮回中不停的挪用queryperformancecounter赢得频次记数器的振动度数并同先前的频次记数器的振动度数相减,将截止除以频次记数器的振动频次,即使到达确定的功夫就实行某个工作,如许就实行了一个比拟透彻的倒计时器的功效。 其余的一种透彻倒计时器的功效是运用多媒介倒计时器因变量(这也是作家的设置,由于这个系列的因变量是在winmm.dll中设置而且是为媒介播放效劳的)。 实行多媒介倒计时器开始要设置timesetevent因变量,该因变量的设置如次: 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 因变量设置中参数udelay设置推迟功夫,以毫秒为单元,该参数十分于timer控件的interval属性。参数uresolution设置倒计时精度,即使诉求尽大概高的精度,要将该参数树立为0;参数lpfunction设置了timesetevent因变量的回调因变量的地方。参数dwuser设置用户自设置的回调值,该值将传播给回调因变量。参数uflags设置准时典型,即使设置为time_oneshot,则只会在当到达udelay设置的功夫后挪用回调因变量一次,即使设置为time_periodic,则在历次到达准时功夫后挪用回调因变量。 即使因变量挪用胜利,在体例中创造了一个多媒介倒计时器东西,每当过程一个udelay功夫后lpfunction指定的因变量城市被挪用。同声因变量归来一个东西标识,即使不复须要倒计时器则必需要运用timekillevent因变量简略倒计时器东西。 因为windows是一个多工作的操纵体例,所以鉴于api挪用的倒计时器的精度城市遭到其它很多成分的干预。究竟这两中倒计时器的精度怎样,咱们来运用以次的步调举行考证: 树立三种倒计时器(timer控件、高本能频次记数、多媒介倒计时器)。将它们的定功夫隔树立为10毫秒,让它们不竣工作直到到达一个比拟长的功夫(比方60秒),如许倒计时器的缺点会被累计下来,而后同本质过程的功夫比拟较,就不妨获得它们的精度。 底下是简直的检验和测定步调。 开始创造一个工程文献,在form第11中学介入一个timer控件,两个commandbutton控件和三个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)         '即使时钟振动度数胜过10毫秒的度数则革新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 = "发端倒倒计时"     command2.caption = "遏止倒计时"     command2.enabled = false          '赢得体例板上时钟频次     queryperformancefrequency lim          '将频次除以1000就的出时钟1毫秒振动的度数     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中介入一个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的回调因变量 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 = "计数器倒计时" + format$((60 - icount), "00.00") + " " _ + "本质过程功夫" + format$((acttime2 / 1000), "00.00") .text2 = "计数器倒计时" + format$((60 - lmmcount), "00.00") + " " _ + "本质过程功夫" + format$((acttime2 / 1000), "00.00") .text3 = "计数器倒计时" + format$((60 - timercount), "00.00") + " " _ + "本质过程功夫" + format$((acttime2 / 1000), "00.00") end with end sub 运路途序,点击“发端倒倒计时”按钮发端倒倒计时,不妨看到两种api倒计时器处事基础平常,文本框中的倒倒计时表露流利,而timer控件的功夫表露比拟之下却不胜重担,格外慢慢。按“遏止倒计时”按钮就不妨遏止倒倒计时,由图1不妨看到,两种api倒计时器的累计缺点在2‰以次,商量到体例因为和处置倒计时表露的功夫,这个缺点基础是不妨接收的,并且过程作家的屡次检验和测定,缺点都在3‰以次。而timer控件的缺点几乎是没辙接收的。 在运路途序时作家还创造一个题目,即使在倒记常常拖动窗口,文本框中的表露城市遏止,而当遏止窗口拖放后,多媒介倒计时器表露会跳过这段功夫倒计时,而其它两种倒计时器表露倒倒计时却仍旧从从来的功夫倒数。这证明多媒介倒计时器是在独力的线程中运转的,不会遭到步调的感化。 归纳上头的引见和典型,咱们不妨看到,即使要创造高精度的倒计时器,运用多媒介倒计时器是比拟好的采用。而高本能频次记数法比拟符合计划某个耗费时间格外短的进程所耗费的功夫(比方领会步调中某个被屡次挪用的步调段实行功夫以优化步调),由于究竟高本能频次记数的表面不妨到达微秒级别。timer控件固然精度比上头两者差很多,然而它运用简单,在诉求不高的场所它仍旧最好采用。 之上步调在windows 98华文版,vb6下运转经过。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.