---恢复内容开始--- 介绍 在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关
---恢复内容开始---
介绍
在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所以我们需要来解决这个问题。
下面是一个普通代码,通过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;
当启动线程后,程序没有出现无响应的问题,或者更本不会发生什么。