Delphi 网络共享 ResourceReceived 无法更新 TLabel

Delphi tethering ResourceReceived fails to update TLabel

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 中然后启用一个稍后设置标签文本值的计时器来解决这个问题。

通常 Delphi 事件在主线程内触发(UI 控件)或与主线程同步(TThread.OnTernimate - 事件)。然而,情况并非总是如此。

Tethering 从后台线程运行,它的事件也是从后台线程调用的。另一方面,所有 UI 访问必须与主 UI 线程同步。

TTetheringProfile class(TTetheringAppProfile 的祖先)有 SynchronizeEvents 属性(默认设置为 True)控制哪个线程是调用的事件。如果 True 所有事件处理程序都将 运行 在主线程的上下文中。

您遇到的症状与从辅助线程访问 UI 一致。检查 SynchronizeEvents 属性 的值或在事件处理程序中与主线程同步 UI 访问。