Timer 基于“的秒表”;计时器“;运行缓慢(c+;+;)

Timer 基于“的秒表”;计时器“;运行缓慢(c+;+;),timer,c++-cli,Timer,C++ Cli,几年前,我使用以下代码制作了一个小型秒表作为学习项目: private: System::Windows::Forms::Timer^ timer1; ... this->timer1->Interval = 10; this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick); ... intCentiSeconds= 0; intSeconds = 0; in

几年前,我使用以下代码制作了一个小型秒表作为学习项目:

private: System::Windows::Forms::Timer^  timer1;
...    
this->timer1->Interval = 10;

this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
...
intCentiSeconds= 0;
intSeconds = 0;
intMinutes = 0;
intHours = 0;
...
private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {

 intCentiSeconds++;
 if(intCentiSeconds==100){
     intCentiSeconds = 0;
     intSeconds++;
 }
 if(intSeconds==60){
     intSeconds = 0;
     intMinutes++;
 }
 if(intMinutes==60){
     intMinutes = 0;
     intHours++;
 }
...
直到昨天我试着用它检查我的心率时,我才意识到它有多高。经过一番摸索,我终于找到了我的“秒表”与Windows时钟和手机秒表的对比,结果发现上面的代码导致了一个非常慢的计时器:在大约1英尺30英寸的时间内计数到1分钟

经过一番挖掘,我发现

Windows窗体计时器组件是单线程的,并且仅限于 精确到55毫秒

我想我已经找到了答案,所以我想我可以用十分之一秒的时间来计时(
this->timer1->Interval=10;
)并重新编译。精度提高了,但仍然很慢。最后,我去掉了所有的亚秒测量值,精度再次提高,但在5分钟内仍然下降了5秒

使用像System::Timers::timer这样更精确的计时器可能会解决这个问题,但我并不特别关心这个秒表,它只是一个从很久以前就开始学习的项目


我想解释一下这里发生了什么。为什么一个假定在55毫秒时准确的计时器在1000毫秒的间隔内仍然明显不准确?

这可能是由于事件处理的开销造成的

计时器每次滴答声都会引发一个事件。UI线程识别和处理此事件需要时间。此外,如果UI线程被其他任务占用,则可能无法立即识别此事件。特别是,如果此开销的大小等于或大于滴答声间隔本身,则您将问题


由于每次触发勾号事件时都会产生这种开销,因此,如果没有正确解释,这种不准确会随着时间的推移而加剧。

这是有道理的。是否有办法对其进行测试并确认发生了什么?