delphi - 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 中然后启用一个计时器来解决这个问题,该计时器稍后设置标签文本的值。
解决方案
通常 Delphi 事件在主线程(UI 控件)内触发或与主线程同步(TThread.OnTernimate
- 事件)。然而,情况并非总是如此。
网络共享从后台线程运行,其事件也从后台线程调用。另一方面,所有 UI 访问必须与主 UI 线程同步。
TTetheringProfile
类(的祖先TTetheringAppProfile
)具有控制在哪个线程上调用事件的SynchronizeEvents
属性(默认设置为)。True
如果True
所有事件处理程序都将在主线程的上下文中运行。
您遇到的症状与从辅助线程访问 UI 一致。检查SynchronizeEvents
属性的值或将 UI 访问与事件处理程序中的主线程同步。
推荐阅读
- java - 如何防止在java中打开同一类的新任务应用程序
- python - 如何在 Django 中注册时将特定组分配给用户
- build - BTDF 构建问题 BizTalk
- javascript - 当 VAPID 仅用于识别服务器推送服务时,为什么需要公共 VAPID 密钥在浏览器端创建订阅对象?
- c - 我不明白这次崩溃
- grep - grep 命令未检索完整功能
- c - 如何从 Linux 中多线程进程的信号处理程序中获取正确的回溯?
- swift - 为什么动画视图从错误的位置开始?
- elasticsearch - Kibana:计算具有相同id字段的count(a)和count(a')之间的差异
- rust - 传递对函数参数的引用(书 v1)