S
sunshinebbs
Unregistered / Unconfirmed
GUEST, unregistred user!
本人编写了一个软件,里面需要用到高精度定时器,最早采用QueryPerformanceFrequency<br>代码为<br>var<br> Start, L: TLargeInteger;<br> Freq: Integer;<br>begin<br> { 取得频率, 并将单位转为 "次/每毫秒" }<br> QueryPerformanceFrequency(L);<br> Freq := Round(L / 1000);<br><br> bStopCounter := False;<br> { 进入回圈前取得开始计数值 }<br> QueryPerformanceCounter(Start);<br> repeat<br> { 不断取得目前计数值 }<br> QueryPerformanceCounter(L);<br><br> { QuadPart 栏位是 Comp 型态, 因此可以直接进行加减乘除运算 }<br> //do something<br> { 让讯息回圈处理讯息, 包括 WM_PAINT, 让 lblElapseTime 元件重绘 }<br> Application.ProcessMessages;<br> until bStopCounter or Application.Terminated;<br><br>后发现CPU资源达到70以上,后来发现多媒体定时器没有问题,也知道它是多线程的,所以编写代码为:<br>procedure TimerProc(uTimerID, uMessage: UINT; dwUser, dw1, dw2:<br> DWORD); stdcall;<br>begin<br> if time > 1000 then exit;<br> time:= mictime + 0.01;<br>end;<br>procedure MMTime(b: Boolean);<br>begin<br> if b then<br> TimerID := timeSetEvent(10, 0, @TimerProc, 0, 1)<br> else<br> timeKillEvent(TimerID);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br> MMTime(False);<br> time := 0;<br> MMTime(True);<br>end;<br><br>后来程序不固定时间出现代码错误,说内存不可写,然后退出程序,在delphi里编译,出现提示什么“致命性错误”,尤其使用界面里的按钮和点击鼠标最为明显,大惑不解,至于分辨率也设过很多次,什么上限,下限的都设过,问题依旧,请高手明示一下怎样使用多媒体定时器最为适合,又或者有没有其他既占资源少,精确度又高的方法!