我有应用程序,我在其中使用表单作为消息框,在此“消息框”中,我运行在其上更改消息的线程,线程完成后,在消息框上我显示按钮,只有单击按钮代码后才能继续
var
FStart: TFStart;
VariableX:Boolean;
implementation
uses UApp,UMess;
{$R *.fmx}
procedure TFStart.Button2Click(Sender: TObject);
begin
VariableX:=false;
{
There i show window and start thread
after finish thread set VariableX as true
and close form
}
// There i need to wait until thread finish
while VariableX = false do Application.ProcessMessages;
{
there i will continue to work with data returned by thread
}
end;
我知道Marco Cantu表示使用Application.ProcessMessages并不是一个好主意
没有Application.ProcessMessages怎么办?
您不应该使用等待循环。因此,您根本不需要ProcessMessages()
在任何平台上使用。
启动线程,然后退出OnClick
处理程序以返回到主UI消息循环,然后在需要更新UI时使线程向主线程发出通知。线程完成后,关闭窗体。
例如:
procedure TFStart.Button2Click(Sender: TObject);
var
Thread: TThread;
begin
Button2.Enabled := False;
Thread := TThread.CreateAnonymousThread(
procedure
begin
// do threaded work here...
// use TThread.Synchronize() or TThread.Queue()
// to update UI as needed...
end
);
Thread.OnTerminate := ThreadDone;
Thread.Start;
end;
procedure TFStart.ThreadDone(Sender: TObject);
begin
Close;
end;