DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: qiaoguoqiang
今日帖子: 4
在线用户: 12
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 ooolinux (ooolinux) ▲△△△△ -
普通会员
2023/2/3 20:20:37
标题:
安卓项目循环中Application->ProcessMessages();运行时界面没有及时变化 浏览:795
加入我的收藏
楼主: 原来一个RAD10.2安卓小项目循环中有如下代码在安卓8手机工作正常,项目升级到RAD11.2编译在安卓11上运行,循环中运行时界面没有变化,循环结束才一次性变到最终界面,如何不修改代码使它工作正常?
Sleep(300);
Application->ProcessMessages();
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/2/3 22:16:28
1楼: I dont know if understood your question, because the Google translator dont help me ...

I think that "Application.ProcessMessage()" (Delphi) is for MSWindows!

in Android, prefere use a "Thread" procedure...

in Android, ALL processing should be on a secondary "thread" (not in Main Thread), because the system can think that your app is "frozen" if the processing is very large...

psedo-code:

ThreadXXX - execute()
  while not Terminaded do
  begin
  ... code
      Thread.Synchronize(nil, 
       procedure 
       begin
        // updates UI 
       end);
      //
      ThreadXXX.Sleep( 300ms );
  end;
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 k3man (嗯哼) ★☆☆☆☆ -
普通会员
2023/2/3 23:46:04
2楼: 有windows下,你可以在主线程中进行UI操作,顺便抽个小空去刷新一下界面以显示最新信息,但 Application->ProcessMessages()都是单线程,只是暂停工作用以显示结果。

如果这样的操作放在Android UI线程中,从Delphi 10.2.2过后,就不被推荐了。一切阻塞模式,都不被谷歌推荐到UI线程中。主线程需要留给足够的资源来响应电话接听等,这就需要将比较耗时的操作放到子线程中去,然后将结果再同步回主线程进行显示。否则过长时间主线程没有响应,会触发Android的响应消息机制以提示用户是否结束该进程。
----------------------------------------------
-
作者:
男 ooolinux (ooolinux) ▲△△△△ -
普通会员
2023/2/5 10:33:10
3楼: @1楼 OK,good
----------------------------------------------
-
作者:
男 ooolinux (ooolinux) ▲△△△△ -
普通会员
2023/2/5 10:34:54
4楼: @2楼 明白了
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2023/2/5 11:25:20
5楼: 安卓的界面机制和win不一样, 要换个思路

吧循环执行放到线程中, 然后通过回调更新界面
界面代码通过状态标记或者界面输入事件的控制来等待线程执行完毕

这样就相当于, 界面不接受输入只显示信息, 等待线程执行完毕状态
线程后面执行, 定时通过回调更新界面信息, 执行完毕再更新状态
收到状态后界面恢复接受输入
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 ooolinux (ooolinux) ▲△△△△ -
普通会员
2023/2/5 13:13:07
6楼: @5楼 通过回调更新界面,是指Synchronize吗?
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2023/2/5 15:52:53
7楼:
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2023/2/5 23:33:28
8楼: 安卓里面,不要对主线程做阻塞,比如 Sleep 什么的。

如果有什么执行时间比较长的工作,也不要放到主线程里面。在安卓下,如果主线程长时间阻塞(Sleep 或者执行一个耗时的代码,比如一个死循环跑1分钟才能跑完的循环加法),则安卓系统会杀死这个 APP

因此,所有耗时的事情,都单独拿个线程来干,线程干完了需要显示的时候才去调用主线程。

当然,假设这个线程中也是一个死循环,要跑10分钟才会结束,如果循环中途不给出一点状态显示,安卓系统倒是不会认为 APP 该杀死了,但用户会认为 APP 死机了。所以线程巡回过程中,如果有必要在界面上做一点显示,就采用【同步】的方式去调用界面显示的方法。
----------------------------------------------
-
作者:
男 ooolinux (ooolinux) ▲△△△△ -
普通会员
2023/2/6 16:11:45
9楼: @8楼 明白了
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行60.54688毫秒 RSS