Delphi 10.4 社区版的动画有 BUG

在使用Delphi 10.4社区版开发的安卓应用中,一个包含蓝牙功能和动画效果的小程序在Android 64位环境下运行时出现异常。经过排查,问题似乎出在TThread.Synchronize的使用上,当蓝牙的CharacteristicRead事件与动画同时运行时,两者可能在内部的TMonitor上发生冲突,导致Segmentation fault (11)错误并程序崩溃。禁用动画后问题解决,表明可能是动画控件与蓝牙模块在同步机制上的不兼容导致的bug。建议避免在Delphi安卓程序中使用内置动画控件,尤其是在涉及多线程操作如蓝牙通信的场景下。
部署运行你感兴趣的模型镜像

做了个简单的小程序,主要功能有蓝牙。放了一个 TCircle 在上面,给它增加了一个 TColorAnimation 用于接收到蓝牙数据的时候,变化颜色闪烁,作为接收到数据的提示。

在 WIDNDOWS 底下运行正常;

在 Android 32 底下运行正常;

在 Android 64 底下运行,过几分钟就会出现异常提示:raised exception class Segmentation fault (11).,然后程序就崩溃了。

以为是蓝牙部分导致的问题,彻底把蓝牙部分的代码屏蔽掉,问题依旧存在。

在出现异常时,查看 Call Stack,发现问题出现在 function NewWaitObj: Pointer;

再往上跟,看到是 class procedure TThread.Synchronize;

再往上跟,发现涉及到 procedure TBluetoothLE.DoOnCharacteristicRead;

看起来是蓝牙的问题。把蓝牙的读数据部分的代码,也就是 BluetoothLE1CharacteristicRead 事件方法里面,写一个 Exit,直接跳出,继续测试,问题依旧。此时,Call Stack 仍然是停在 function NewWaitObj: Pointer;这里,往上看,里面有和动画相关的代码。

于是,干脆把动画停掉,再次测试,问题不再出现。

看起来,是蓝牙的 BluetoothLE1CharacteristicRead 事件方法,在内部采用了 TThread.Synchronize,里面采用了 TMonitor;而动画也是线程,最终也要用 TThread.Synchronize 同步到主线程,也同样用到了 TMonitor;然后这两个冲突了?

而且不是一定冲突,是跑几分钟后才冲突。跑了几分钟,TBluetoothLE.DoOnCharacteristicRead 执行了大概 200 次,动画也转了几十圈。

总之,测试结果发现 Delphi 10.4 社区版内部关于 TThread.Synchronize 的代码,在安卓64底下有BUG,具体原因还不清楚。

结论:用 Delphi 写安卓程序,还是尽量不要用它提供的动画控件。

您可能感兴趣的与本文相关的镜像

lora-scripts 模型训练工具

lora-scripts 模型训练工具

AI应用
模型微调
PyTorch
TensorRT

lora-scripts 是一款开箱即用的 LoRA 训练自动化工具,封装了数据预处理、模型加载、训练调参、权重导出等全流程,无需手动编写复杂训练代码,支持 Stable Diffusion(图文生成)、LLM(大语言模型)等主流模型的 LoRA 微调,适配新手和进阶用户。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值