首页 > 解决方案 > Delphi tethering ResourceReceived 无法更新 TLabel

问题描述

Delphi 10.2.3 FMX 应用程序共享

有时以下代码中的标签会更新,但通常不会。在 tethering ResourceReceived 过程中更新可视组件是否不安全?

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

标签: delphidelphi-10.2-tokyo

解决方案


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

网络共享从后台线程运行,其事件也从后台线程调用。另一方面,所有 UI 访问必须与主 UI 线程同步。

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

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


推荐阅读