Delphi XE6 使用定时器或者线程解决程序界面无响应问题
---恢复内容开始---
介绍
在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所以我们需要来解决这个问题。
下面是一个普通代码,通过for来循环添加ListVIew行,代码很简单,大家都见过
var I: Integer; Total: Integer; begin // counts the prime numbers below the given value Total := 0; for I := 1 to MaxValue do begin if (I * 10 mod MaxValue) = 0 then ListView1.Items.Add.Text := 'B: ' + I.ToString; if IsPrime (I) then Inc (Total); end; ListView1.Items.Add.Text := 'Blocking: ' + Total.ToString; 复制代码
在运行过程中,程序是无响应的,屏幕更本不刷新,直到运行结束,但是这里有个问题,MaxValue如果少还行,如果数值比较大,那么我们就会看到如下的界面
提示了程序没有响应,是否需要关闭它,这显示是个大问题,我们需要来解决。
解决这个问题可以通过定时器或者线程,但是相比线程,定时器差很多,如果代码比较复杂,还是可能会出现上面的问题,目前解决UI无法响应,真正的解决方法还是通过线程的方法,实现线程当然是非常简单,但是也需要注意,在更新UI的时候,需要使用“synchronize”。
procedure TForm5.Button3Click(Sender: TObject); begin TThread.CreateAnonymousThread(procedure () var I: Integer; Total: Integer; begin Total := 0; for I := 1 to MaxValue do begin if (I * 10 mod MaxValue) = 0 then TThread.Synchronize (TThread.CurrentThread, procedure () begin ListView1.Items.Add.Text := 'Th: ' + I.ToString; end); if IsPrime (I) then Inc (Total); end; TThread.Synchronize (TThread.CurrentThread, procedure () begin ListView1.Items.Add.Text := 'Thread: ' + Total.ToString; NotifyComplete; end); end).Start; end;
当启动线程后,程序没有出现无响应的问题,或者更本不会发生什么。
好的代码像粥一样,都是用时间熬出来的
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)