• 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;

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

  • 相关阅读:
    测试杂谈
    使用jQuery完成表单验证
    session&&cookie
    jQuery中关于toggle的使用
    Regist&Login
    关于线程的面试题
    成语验证码所需素材
    验证码测试-demo
    java动态生成验证码图片
    servlet-向页面输出中文出现乱码处理方式
  • 原文地址:https://www.cnblogs.com/jijm123/p/11505757.html
Copyright © 2020-2023  润新知