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 :&#61; GetTickCount - FTickCount;
Application.ProcessMessages;
end;
postMessage(Handle, WM_A, 0, 0);
end;
我一般是设一个全局变量,A完成后设1.B发现变量为1,则进行下一步,然后再设为2.A发现为2,则下一步.
那就不要用Time来控制&#xff0c;用递归&#xff01;
我一般是设一个全局变量,A完成后设1.B发现变量为1,则进行下一步,然后再设为2.A发现为2,则下一步.
//
不牵扯到多线程当然可以这样&#xff0c;你这样做还会有问题吗&#xff1f;应该能够解决了&#xff01;