当前位置 : 主页 > 编程语言 > delphi >

Delphi XE6 使用定时器或者线程解决程序界面无响应问题

来源:互联网 收集:自由互联 发布时间:2021-06-23
---恢复内容开始--- 介绍 在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关

---恢复内容开始---

介绍

在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所以我们需要来解决这个问题。

下面是一个普通代码,通过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;

当启动线程后,程序没有出现无响应的问题,或者更本不会发生什么。

网友评论