Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1226717
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-11-18 14:50:22



现有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,则下一步.  
  //////////////////////////////////////////////////  
  不牵扯到多线程当然可以这样,你这样做还会有问题吗?应该能够解决了!



[新闻]Google iPhone语音识别程序已经上线
博客园首页 社区 新闻频道 小组 博问 网摘 闪存
阅读(300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~