我有使用表格作为消息框的应用程序,
在这个“消息框”中,我运行线程来更改消息
在线程完成后,在消息框上我会显示按钮,只有在单击按钮代码后才能继续

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不是一个好主意
在我的情况下,应用程序以sigterm停止(在Windows和ios上运行正常)

没有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;

10-08 07:38