登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 开发 vlog >> 主题: TThread.Synchronize(nil, 可解决 lazarus 中 TFPHttpServer 线程模式下无法正常处理同步 ui 的问题     [回主站]     [分站链接]
标题
TThread.Synchronize(nil, 可解决 lazarus 中 TFPHttpServer 线程模式下无法正常处理同步 ui 的问题
clq
浏览(11) + 2025-07-26 15:06:02 发表 编辑

关键字:

TThread.Synchronize(nil, 可解决 lazarus 中 TFPHttpServer 线程模式下无法正常处理同步 ui 的问题

https://www.bilibili.com/video/BV1SR8sz2Ezb/

--------------------------------------------------------

用 govcl 的时候我就发现了 lazarus 线程中调用自己的 Synchronize 去同步 ui 有时候是有问题的,并且在线程中创建的 ui 组件比如定时器也会有莫名的问题。这次本来需要一个简单的 http 的测试接口,不想用控件,直接用的 TFPHttpServer ,也是始终无法完全正常处理 ui ,TFPHttpServer 还支持切换线程和非线程模式,可惜两种模式下操作同步 ui 都有诡异问题。大失所望之下放了几周。无意看到 github 上有 indy 10 的开源仓库了就下来一试,比较顺利的完成了。

要吐槽的是,indy 10 的 httpserver 接口与 d7 下的也是完全不同的 ... 好一阵折腾。折腾完后用 indy 上的解决方法放到 TFPHttpServer 上,发现居然是成功的!
实际上处理方法也比较简单:就是不要在 thread 类中调用自己的 Synchronize (这是 delphi 的标准做法),而是用全局的 TThread.Synchronize() 去调用类的同步函数!另外TThread.Synchronize(nil, 的第一个参数是可以为 nil 的 ... 这好像和我最早学的时候不太一样啊,不知道是不是我记错了,总之实测能完好工作的调用方式其实是

TThread.Synchronize(nil,

@self.UpdateUI //这样,UpdateUI 就是在 ui 主线程中运行了

);我也不知道为什么线程中的 Synchron... 为什么不行,很可能是 lazarus/fpc 自身的一个线程 bug ,在 govcl 下就有很多线程代码无法工作的情况。只是把 lazarus 当做一个简单的 ui 工具库,也不想细究了。



总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1