Delphi привязывает ResourceReceived не удается обновить TLabel - PullRequest
0 голосов
/ 06 ноября 2018

Delphi 10.2.3 FMX приложение модема

Иногда метка в следующем коде обновляется, но часто нет. Не безопасно ли обновлять визуальный компонент во время привязки RescourceReceived?

procedure TMainForm.MyTetheringAppProfileResourceReceived(
  const Sender: TObject; const AResource: TRemoteResource);

begin
  if AResource.Hint = 'InfoPrincipleVariation'
    then
      begin

        MyInformationLabel.Text := AResource.Value.AsString;  // Fails to update
        Exit;
      end;
end;

Я обошел проблему, сохранив значение в AResource.Value.AsString, а затем включив таймер, который позже установит значение текста метки.

1 Ответ

0 голосов
/ 06 ноября 2018

Обычно события Delphi запускаются в основном потоке (элементы управления пользовательского интерфейса) или синхронизируются с основным потоком (TThread.OnTernimate - событие). Однако это не всегда так.

Модем работает из фонового потока, и его событие также вызывается из фонового потока. С другой стороны, весь доступ к пользовательскому интерфейсу должен быть синхронизирован с основным потоком пользовательского интерфейса.

Класс

TTetheringProfile (предок TTetheringAppProfile) имеет свойство SynchronizeEvents (по умолчанию установлено True), которое определяет, для какого потока вызываются события. Если True, то все обработчики событий будут выполняться в контексте основного потока.

Симптомы, которые у вас возникают, согласуются с доступом к пользовательскому интерфейсу из вторичного потока. Проверьте значение свойства SynchronizeEvents или синхронизируйте доступ пользовательского интерфейса с основным потоком в вашем обработчике событий.

...