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 访问。
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 访问。