在Delphi中延迟执行

时间:2018-12-13 05:20:21

标签: delphi delayed-execution

是否可以在调用过程结束后延迟启动过程?

procedure StartLoop;
begin
  DoSomething;
end;

procedure FormCreate(...);
begin
  if ParamStr(1)='start' then StartLoop;
end;

StartLoop将被称为 inside FormCreate,并且FormCreate将处于等待状态,不仅阻止进一步执行FormCreate本身,还阻止其后执行的其他过程(FormShow等)和表单在StartLoop结束之前不会显示。

我需要等待FormCreate结束,然后再运行StartLoop(不使用线程)。

3 个答案:

答案 0 :(得分:10)

如果您使用的是10.2 Tokyo或更高版本,则可以使用TThread.ForceQueue()

procedure TMyForm.FormCreate(Sender: TObject);
begin
  if ParamStr(1) = 'start' then
    TThread.ForceQueue(nil, StartLoop);
end;

否则,您可以改用PostMessage()

const
  WM_STARTLOOP = WM_USER + 1;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  if ParamStr(1) = 'start' then
    PostMessage(Handle, WM_STARTLOOP, 0, 0);
end;

procedure TMyForm.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_STARTLOOP then
    StartLoop
  else
    inherited;
end;

答案 1 :(得分:7)

最简单的方法是使用计时器。

让您创建具有所需时间段的DelayTimer,并在设计时在表单上创建Enabled = False(也可以动态创建)。为它分配事件处理程序:

  procedure TFormXX.DelayTimerTimer(Sender: TObject);
  begin
     DelayTimer.Enabled := False;   // works only once
     StartLoop;
  end;

在形式初始化例程中启动此计时器:

 procedure FormCreate(...);
 begin
   if ParamStr(1)='start' then  
       DelayTimer.Enabled := True; 
 end;

如果您的应用在创建过程中执行了一些连续的操作,也许您想稍后再启动计时器,例如在OnShow中。

答案 2 :(得分:0)

另一个解决方案可能是将DoSomething方法包装到Task中:

uses
  System.Threading;

procedure TForm2.DoSomething;
begin
  Sleep(2000);
  Caption := 'Done';
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  if ParamStr(1) = 'start' then
    TTask.Run(
      procedure
      begin
        DoSomething
      end);
end;