Delphi束缚ResourceReceived无法更新TLabel

时间:2018-11-06 19:07:28

标签: delphi delphi-10.2-tokyo

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 :(得分:5)

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

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

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

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