delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
Timer控制问题 VCL组件开发及应用
http://www.delphi2007.net/DelphiVCL/html/delphi_20061223220551160.html
现有2个过程A和B,A使用Timer控制每隔一定时间T执行一次,执行完成以后再执行B过程,如果B执行时间超过A的时间间隔T,这时Timer执行A的定时到了,程序会怎么处理?有没有其它好的方法去控制?线程吗

哈,进入Timer就enabled   :=   False;   B执行完了再True.

//会出现冲突  
  //建议判断一下是否在处理中  
   
  procedure   TForm1.Timer1Timer(Sender:   TObject);  
  begin  
      if   FRunning   then   Exit;  
      FRunning   :=   True;  
      try  
          A;  
          B;  
      finally  
          FRunning   :=   False;  
      end;  
  end;

楼上的方法也不错,用线程一样会碰到这样的问题

用消息传递来控制执行顺序和时间间隔最适宜

const  
      WM_A   =   WM_User   +   1;  
      WM_B   =   WM_User   +   2;  
   
  type  
      TFormDemo   =   class(TForm)  
          procedure   FormCreate(Sender:   TObject);  
      private  
          FTickCount:   LongInt;  
          procedure   A(var   Msg:   TMessage);   Message   WM_A;  
          procedure   B(var   Msg:   TMessage);   Message   WM_B;  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      FormDemo:   TFormDemo;  
   
  implementation  
   
  {$R   *.dfm}  
   
  {   TFormDemo   }  
   
  procedure   TFormDemo.FormCreate(Sender:   TObject);  
  begin  
      PostMessage(Handle,   WM_A,   0,   0);  
  end;  
   
  procedure   TFormDemo.A(var   Msg:   TMessage);  
  begin  
      FTickCount   :=   GetTickCount;  
      {ProcessA}  
      PostMessage(Handle,   WM_B,   0,   0);  
  end;  
   
  procedure   TFormDemo.B(var   Msg:   TMessage);  
  var  
      Interval:   Integer;  
  begin  
      {ProcessB}  
      Interval   :=   GetTickCount   -   FTickCount;  
      while   Interval   <   10000   do   //假设A的执行间隔为10秒  
      begin  
          Interval   :=   GetTickCount   -   FTickCount;  
          Application.ProcessMessages;  
      end;  
      postMessage(Handle,   WM_A,   0,   0);  
  end;

我一般是设一个全局变量,A完成后设1.B发现变量为1,则进行下一步,然后再设为2.A发现为2,则下一步.

那就不要用Time来控制,用递归!

我一般是设一个全局变量,A完成后设1.B发现变量为1,则进行下一步,然后再设为2.A发现为2,则下一步.  
  //////////////////////////////////////////////////  
  不牵扯到多线程当然可以这样,你这样做还会有问题吗?应该能够解决了!

posted on 2008-11-18 14:34 delphi2007 阅读(169) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。