procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  try
    ...
  finally
    Timer1.Enabled := True;
  end;
end;
你可以这样做。

解决方案 »

  1.   

    队列中只允许一个WM_TIMER消息,如果OnTimer事件没有处理完,那么新产生的消息会被丢弃。
      

  2.   

    是丢弃新来的那个消息吗,我怎么觉得是会放弃当前OnTimer内的执行,又去重新开始执行OnTimer事件咧!!不知你说的这个有没有官方的WINDOWS文档咧??
      

  3.   

    是丢弃新来的那个消息吗,我怎么觉得是会放弃当前OnTimer内的执行,又去重新开始执行OnTimer事件咧!!不知你说的这个有没有官方的WINDOWS文档咧??我这个
    按常理来说,中断当前的执行是十分危险的。我的参考是李维的delphi深度历险
    80页,说“
    WM_PAINT和WM_TIMER都属于低优先权的窗口消息,只有在队列没有消息的时候才会被取出,另外,一个队列绝不会同时含有超过一个WM_PAINT和WM_TIMER消息,若上回触发的事件还未被处理,新的消息就不会进入队列而是直接被舍弃……”
    (这本书写的是基于Win3.1的,但我认为它的机制不会改变很多)
      

  4.   

    OnTimer是在主线程里的,所以执行完才会响应下一条。
      

  5.   

    是丢弃新来的那个消息吗,我怎么觉得是会放弃当前OnTimer内的执行,又去重新开始执行OnTimer事件咧!!不知你说的这个有没有官方的WINDOWS文档咧??我这个
    按常理来说,中断当前的执行是十分危险的。我的参考是李维的delphi深度历险
    80页,说“
    WM_PAINT和WM_TIMER都属于低优先权的窗口消息,只有在队列没有消息的时候才会被取出,另外,一个队列绝不会同时含有超过一个WM_PAINT和WM_TIMER消息,若上回触发的事件还未被处理,新的消息就不会进入队列而是直接被舍弃……”
    (这本书写的是基于Win3.1的,但我认为它的机制不会改变很多)谢谢您的详细解说!Thank you!