是否可以在调用过程结束后延迟启动过程?
procedure StartLoop;
begin
DoSomething;
end;
procedure FormCreate(...);
begin
if ParamStr(1)='start' then StartLoop;
end;
StartLoop将被称为 inside FormCreate,并且FormCreate将处于等待状态,不仅阻止进一步执行FormCreate本身,还阻止其后执行的其他过程(FormShow等)和表单在StartLoop结束之前不会显示。
我需要等待FormCreate结束,然后再运行StartLoop(不使用线程)。
答案 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;