2007年2月2日星期五

BCB中的计时与显示

在程序开发中常要实现计时与计时显示。在BCB中一般方式是利用Timer控件来进行计时。样例代码如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
    // timer interval callback function
    iTimerCount ++ ;
    if ( iTimerCount > 1000 ) { Timer1->Enabled = false; }
}
但Timer控件有两个缺陷:
(1)其不是一个精确的计时器,其只能保证秒级的精确性,即只有设置其Interval属性为1000的倍数是才是比较准确的。
(2)其运行级别很低,这样在多线程程序中会造成高级别线程堵塞了Timer线程从而造成计时不准确。
认识到以上两点,可将Timer控件只作为时间显示来用,而不作为计时,在每次显示时获取当前时间,并用MilliSecondsBetween函数与开始计时时间进行比较,得到毫秒级的差值,然后进行格式化显示。
样例代码如下:
(1)开始计时代码:
  iTimerCount = 0;
  startTime = Time();//< startTime 是一个 TDataTime 变量
(2)计时代码:
  void __fastcall TFrmMain::Timer1Timer(TObject *Sender) {
    // timer interval callback function
    double msValue = MilliSecondsBetween( Time(),startTime );
    Label5->Caption = AnsiString( msValue / 1000.0 );
    iTimerCount ++ ;
    if ( iTimerCount > 1000 ) { Timer1->Enabled = false; }
}
 

0 评论: