当在数据量比较大的情况下,在循环过程中,应用程序出现无法响应,怎么解决?不知道大家明白我的意思否

解决方案 »

  1.   

    for i:=0 to dataset.recordcount-1 do
    begin
       xxx
       application.ProcessMessages;
       dataset.next;
    end;
      

  2.   

    ProcessMessages,可以部分解决假死状况,不过还是优化代码,避免这种情况发生
      

  3.   


    现在用application.ProcessMessages能基本解决这个问题没有什么具体的代码,这种情况我是经常遇到,例如数据量大的时候,特别是写进EXCEL的时候,一个一个单元格的填充,更加明显。不知道大家还有什么好办法来处理的。
      

  4.   

    application.ProcessMessages; + Sleep(10);
    要是性能有要求,就放线程里去
      

  5.   

    下面是我收藏的一个帖子Delphi编程将数据库数据快速导入Excel !
    http://www.ttjcw.net/html/bianchengkaifa/Delphijiaocheng/8070.html
    或许有帮助
      

  6.   

    首先当然是打开你的delphi 7 ,点取菜单栏中的文件-新建-其它,弹出一个标签窗口,选取new标签,然后找到Thread Object(线程对象),就是它了,双击它就行了,弹出一个类命名窗口,输入mythread,当然名称可由你自已来定的。这时程序自动创建一个unit,我这里是unit2,现在我们来看unit,代码如下:
      unit Unit2;
      interface
      uses
       Classes;
      type
       mythread = class(TThread)
       private
       { Private declarations }
       protected
       procedure Execute; override;
       end;
      implementation
      { Important: Methods and properties of objects in VCL or CLX can only be used
       in a method called using Synchronize, for example,
       Synchronize(UpdateCaption);
       and UpdateCaption could look like,
       procedure mythread.UpdateCaption;
       begin
       Form1.Caption := 'Updated in a thread';
       end; }
      { mythread }
      procedure mythread.Execute;
      begin
       { Place thread code here }        //这里就是加入程序代码的地方了
      end;
      end.
      其中,你注意找到procedure mythread.execute;,应找到了吧,连我都看到了,这就是你刚才建立的线程了,那么接下来,我们要做的就是加入后台执行的代码,代码要加在那里?不会吧,当然是加在
      begin
      //这里就是加入程序代码的地方了
      end;
      如果你要调用unit1上的控件,你可以在unit2上面的uses中加入unit1就行了,记住,在unit1里的implementation后面增加uses unit2,这样你就可在unit1中引用线程了,引用的方法很简单,就是mythread.Create(false);。OK 这就是delphi中的线程。
      

  7.   


    delphi的帮助有例子,demos文件夹里面也有demo程序
      

  8.   


    用application.ProcessMessages和线程的耗时差不多好像,大家怎么看?
      

  9.   

    11楼说的不错       给你的处理语句建立一个新的线程  就解决了~
    肯定线程要好一点  他和你的主程序交替运行   不会有卡死的感觉
    要我说:你不如写一个正在处理中的界面,用一个滚动条表示进度,自己模拟一下(1,2s左右),这期间你的窗体.Enable:=False;   这样的话既体面又解决了你的问题