Android и Application.ProcessMessages - PullRequest
       14

Android и Application.ProcessMessages

2 голосов
/ 09 ноября 2019

У меня есть приложение, в котором я использую форму в качестве окна сообщения, в этом «окне сообщения» я запускаю поток, в котором меняются сообщения и после завершения потока, в окне сообщения я показываю кнопки, только после нажатия на код кнопки можно продолжить

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;

Я знаю, что Марко Канту говорит, что не очень хорошая идея использовать Application.ProcessMessages. В моем случае приложение останавливается с sigterm (в Windows и IOS работает хорошо)

Как это сделатьэто без Application.ProcessMessages?

1 Ответ

7 голосов
/ 09 ноября 2019

Вы не должны использовать цикл ожидания. Таким образом, вам вообще не нужно было бы использовать ProcessMessages() на любой платформе.

Запустите поток, а затем выйдите из обработчика OnClick, чтобы вернуться к главному циклу сообщений пользовательского интерфейса, а затем получить уведомление о выпуске потокав основной поток, когда он должен обновить пользовательский интерфейс. Когда поток завершен, закройте форму.

Например:

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;
...