Delphi tethering ResourceReceived无法更新TLabel

Delphi tethering ResourceReceived无法更新TLabel,delphi,delphi-10.2-tokyo,Delphi,Delphi 10.2 Tokyo,德尔福10.2.3 FMX应用程序栓系 有时,下面代码中的标签会得到更新,但通常不会。在拴系重建过程中更新可视组件是否不安全 procedure TMainForm.MyTetheringAppProfileResourceReceived( const Sender: TObject; const AResource: TRemoteResource); begin if AResource.Hint = 'InfoPrincipleVariation' then

德尔福10.2.3 FMX应用程序栓系

有时,下面代码中的标签会得到更新,但通常不会。在拴系重建过程中更新可视组件是否不安全

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
-event)。然而,情况并非总是如此

栓系从背景线程进行操作,其事件也从背景线程调用。另一方面,所有UI访问必须与主UI线程同步

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


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

这是完全错误的重复。这并不是关于是否可以从后台线程更新UI,而是为什么从栓系事件更新UI不起作用。由于Delphi事件通常在主线程上运行,这有点出乎意料。@DalijaPrasnikar:很公平,我投票重新打开这个q,因为我不想扼杀答案。但是看看
TTetheringAppProfile.DoResourceReceived的源代码,我觉得它可以从另一个线程调用,这取决于
SynchronizeEvents
的值。我游泳…@MartynA,谢谢。是的,它可以从另一个线程调用,但对于Delphi来说,拖放组件具有不在主线程上下文中运行的事件有些意外。事实上,在AppTethering推出的那一天,它根本没有SynchronizeEvents属性,但它是在人们普遍对它的工作原理感到困惑之后添加的:)对于tethering manager和tethering profile组件,
SynchronizeEvents
属性都设置为True,这是默认设置。不过,我同意这种行为与从后台线程访问UI控件是一致的,这是我没有预料到的。