你必须将ADOQuery1.Open的代码放到一个线程里。

解决方案 »

  1.   

    你的大数据如果是阻塞的会卡住消息,GIF是基于WM_TIMER消息的,所以也会卡住.
    除非你象楼上说的把大数据操作放到线程去处理,或者干脆把GIF放到线程中,但要注意线程和界面的问题,还要处理线程的消息循环.
    所以还是推荐把大数据放到线程的方案
      

  2.   

    涉及到读写磁盘地,就会涉及到二个基本的问题,
    一是读写磁盘文件的等待时间,它比其它代码执行要慢得多。 
    二是读写磁盘文件代码与,后续执行代码的关系。(有时读写磁盘文件未曾完成,就开始执行后续代码,造成错误)
    解决上述问题,常通过二种办法:
    一是将读写磁盘文件代码列入一线程中,让它最终完成操作。
    二是在读写磁盘文件代码后,加入sleep代码,它后续代码等待。如何使用只有自己权衡了。 
      

  3.   

    3楼的你就不用看了!冒似关系不大!问题解决的最好的办法就是线程,其他的都会阻塞GIF的运行。把查询放到线程中就可以了。
      

  4.   

    把查询放到线程中可以
    把Gif放到线程中是不行的
      

  5.   


    MyThread := Thread.CreateAnonymousThread(
    procedure
    begin
       with ADOQuery1 do
       begin
         Close;
         SQL.Clear;
         SQL.Add('select * from 大数据');
         Open;
       end;
    end);
    MyThread .Start;
      

  6.   

    Thread.CreateAnonymousThread 貌似只有xe有,xe前的版本不存在
      

  7.   

    可以先建立一个窗体,预置好GIF动画。
    在执行前调用窗体,就像你拷贝文件时,会一个进度条一样……
    到你查询完毕,OPEN后,将该窗体隐藏,或者释放……
      

  8.   


    cxgrid修改一个属性,然后写两行代码就OK了
      

  9.   


    这样不行的,GIF动画照样会卡死,直至查询结束
      

  10.   

    查询工作要放在线程里,
    创建一个窗体,开始查询前创建窗体。窗体里放GIF显示。
    查询结束时给窗体一个消息,然后窗体关闭。
      

  11.   

    可以简单点,在窗体上动态生成一个panel,在上面提示正在查询,请稍等。,try
      //生成panel
     ....//查询
     .open;
    finally
      //panel释放
    end;
      

  12.   

    http://download.csdn.net/detail/seleron/7755875
      

  13.   

    http://download.csdn.net/detail/seleron/7755875
      

  14.   

    可以通过单独的exe来实现进度的显示
    exe与查询函数之间通过消息传递参数显示进度exe代码如下unit uProgressbar;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, StdCtrls,
      ComCtrls, ExtCtrls, Clipbrd;const
      SetPosition_Message=WM_USER+$100;
      StartBar_Message=WM_USER+$101;
      StopBar_Message=WM_USER+$102;
      UnloadBar_Message=WM_USER+$103;
      SetMaxValue_Message=WM_USER+$104;
      SetTip_Message=WM_USER+$105;
      SetTipClip_Message=WM_USER+$106;
      WMCOPYDATA=WM_COPYDATA;type
      TfrmProgressbar = class(TForm)
        pb1: TProgressBar;
        lbl1: TLabel;
        tmr1: TTimer;
        lblTip: TLabel;
        procedure tmr1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }    procedure SetPositionMessage(var MyMsg:TMessage);message SetPosition_Message;
        procedure StartBarMessage(var MyMsg:TMessage);message StartBar_Message;
        procedure StopBarMessage(var MyMsg:TMessage);message StopBar_Message;
        procedure UnloadBarMessage(var MyMsg:TMessage);message UnloadBar_Message;
        procedure SetMaxValueMessage(var MyMsg:TMessage);message SetMaxValue_Message;
        procedure SetTipMessage(var MyMsg:TMessage);message SetTip_Message;
        procedure SetTipClipMessage(var MyMsg:TMessage);message SetTipClip_Message;
        procedure WMCOPYDATA(var MyMsg:TMessage);message WM_COPYDATA;
      public
        { Public declarations }
      end;var
      frmProgressbar: TfrmProgressbar;implementation{$R *.dfm}procedure TfrmProgressbar.StartBarMessage(var MyMsg:TMessage);
    begin
      lbl1.Caption:='';
      tmr1.Enabled:=true;
    end;procedure TfrmProgressbar.StopBarMessage(var MyMsg:TMessage);
    begin
      lbl1.Caption:='';
      tmr1.Enabled:=false;
      pb1.Position:=0;
    end;procedure TfrmProgressbar.tmr1Timer(Sender: TObject);
    begin
      pb1.Position:=pb1.Position+1;
      if pb1.Position=pb1.Max then
      begin
        pb1.Position:=0;
      end;
    end;procedure TfrmProgressbar.SetPositionMessage(var MyMsg:TMessage);
    var
      MyVal:integer;
    begin
      MyVal:=MyMsg.WParam;
      pb1.Position:=MyVal;
      lbl1.Visible:=true;
      lbl1.Caption:='共 '+ inttostr(pb1.Max)+' 条 / 当前第 '+ inttostr(MyVal) +' 条';
    end;procedure TfrmProgressbar.SetMaxValueMessage(var MyMsg:TMessage);
    var
      MyVal:integer;
    begin
      lbl1.Visible:=true;
      MyVal:=MyMsg.WParam;
      pb1.Max :=MyVal;
      lbl1.Caption:='共 '+ inttostr(MyVal)+' 条';
    end;procedure TfrmProgressbar.SetTipMessage(var MyMsg:TMessage);
    var
      MyVal:integer;
      strTip:pchar;
    begin
      MyVal:=MyMsg.LParam;
      ShowMessage(IntToStr(myval));
      strTip:=pointer(Myval);
      lblTip.Caption:=strTip;
      ShowMessage(strTip);
    end;procedure TfrmProgressbar.SetTipClipMessage(var MyMsg:TMessage);
    var
      MyVal:integer;
      strTip:string;
    begin
      MyVal:=MyMsg.LParam;
      if MyVal=1 then
      begin
        strTip:=Clipboard.AsText;
        Clipboard.Clear;
        lblTip.Caption:=strTip;
      end;
      //ShowMessage(strTip);
    end;procedure TfrmProgressbar.WMCOPYDATA(var MyMsg:TMessage);
    var
      Data : ^tagCOPYDATASTRUCT;
      strTip:string;
    begin
      Data:=Pointer(MyMsg.LParam);
      strTip:= StrPas(Data.lpData);
      strTip:=Copy(strTip,1,Data.dwData);
      lblTip.Caption:=strTip;
      //showmessage(strtip);
    end;procedure TfrmProgressbar.UnloadBarMessage(var MyMsg:TMessage);
    begin
      close;
    end;procedure TfrmProgressbar.FormCreate(Sender: TObject);
    begin
      SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
      self.DoubleBuffered:=true;
    end;end.调用显示进度exe代码如下unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      StdCtrls, Dialogs, ShellAPI;
    const
      SetPosition_Message=WM_USER+$100;
      StartBar_Message=WM_USER+$101;
      StopBar_Message=WM_USER+$102;
      UnloadBar_Message=WM_USER+$103;
      SetMaxValue_Message=WM_USER+$104;type
      TForm1 = class(TForm)
        btn1: TButton;
        btn2: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      vH:THandle;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
    var
      i:integer;
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH = 0 then
      begin
        shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
        while vh=0 do
        begin
          vH := findwindow('TfrmProgressbar', 'frmProgressbar');
        end;
      end;  sendmessage(vH ,StartBar_Message,0,0);  //此处模拟执行大数据查询
      for i:=0 to 127670 do
      begin
        Self.Caption:=IntToStr(i);
      end;  sendmessage(vH ,UnloadBar_Message,0,0);
      showmessage('完毕');
    end;procedure TForm1.btn2Click(Sender: TObject);
    var
      i:integer;
      intCount:integer;
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH = 0 then
      begin
        shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
        while vh=0 do
        begin
          vH := findwindow('TfrmProgressbar', 'frmProgressbar');
        end;
      end;  intCount:=10000;
      sendmessage(vH ,SetMaxValue_Message,intCount+1,0);  //此处模拟执行多行读写
      for i:=0 to intCount do
      begin
        Self.Caption:=IntToStr(i);
        sendmessage(vH ,SetPosition_Message,i+1,0);
      end;  sendmessage(vH ,UnloadBar_Message,0,0);
      showmessage('完毕');
    end;end.
    效果如下图
      

  15.   

    这个是更多的调用exe显示进度的测试代码
    unit Unit1;interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, shellapi, Clipbrd;
    const
      SetPosition_Message=WM_USER+$100;
      StartBar_Message=WM_USER+$101;
      StopBar_Message=WM_USER+$102;
      UnloadBar_Message=WM_USER+$103;
      SetMaxValue_Message=WM_USER+$104;
      SetTip_Message=WM_USER+$105;
      SetTipClip_Message=WM_USER+$106;type
      TForm1 = class(TForm)
        btn6: TButton;
        btn7: TButton;
        btn8: TButton;
        btn9: TButton;
        btn10: TButton;
        btn11: TButton;
        btn12: TButton;
        btn13: TButton;
        procedure btn6Click(Sender: TObject);
        procedure btn7Click(Sender: TObject);
        procedure btn8Click(Sender: TObject);
        procedure btn9Click(Sender: TObject);
        procedure btn10Click(Sender: TObject);
        procedure btn11Click(Sender: TObject);
        procedure btn12Click(Sender: TObject);
        procedure btn13Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
        vH:HWND;
    implementation{$R *.dfm}procedure TForm1.btn6Click(Sender: TObject);
    var
      lngS:LongInt;
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH = 0 then
      begin
        //ShowMessage('begin shell');
        shellexecute(self.Handle,'open',PChar(ExtractFilePath(Application.ExeName) +'ProgressbarExe.exe'),'frmProgressbar',nil,SW_SHOWNORMAL);
        lngs:=gettickcount;
        while ((vh=0) and (gettickcount-lngs<5000)) do
        begin
          vH := findwindow('TfrmProgressbar', 'frmProgressbar');
        end;
        //ShowMessage('suc shell');
      end
      else
      begin
        ShowMessage(IntToStr(VH));
      end;
    end;procedure TForm1.btn7Click(Sender: TObject);
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        PostMessage(vH, SetPosition_Message, 20, 0);
      end
      else
      begin
        showmessage('VH=0');
      end;
    end;procedure TForm1.btn8Click(Sender: TObject);
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        PostMessage(vH, StartBar_Message, 0, 0);
      end;
    end;procedure TForm1.btn9Click(Sender: TObject);
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        PostMessage(vH, StopBar_Message, 0, 0);
      end;
    end;procedure TForm1.btn10Click(Sender: TObject);
    begin
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        PostMessage(vH, UnloadBar_Message, 0, 0);
      end;
    end;procedure TForm1.btn11Click(Sender: TObject);
    var
      Data:tagCOPYDATASTRUCT;
      pBuf:PChar;
      strTip:string;
    begin
      strTip:='正在加载...';
      //strTip:='zzfz...';
      GetMem(pBuf, Length(strTip) + 1);
      
      try
        //ShowMessage(IntToStr(Length(strTip)));    ZeroMemory(pBuf, Length(strTip) + 1);
        StrPCopy(pBuf, strTip);
        Data.cbData:= Length(strTip);
        Data.dwData:= Length(strTip);
        Data.lpData:= pBuf;
        vH := findwindow('TfrmProgressbar', 'frmProgressbar');
        if vH > 0 then
        begin
          sendMessage(VH, WM_COPYDATA, Integer(self.Handle), Integer(@Data));
        end
        else
        begin
          showmessage('VH=0');
        end;
      finally
        FreeMem(pBuf);
      end;
    end;procedure TForm1.btn12Click(Sender: TObject);
    var
      strtip:string;
    begin
      strtip:='正在加载...';
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        ShowMessage('begin sendmessage');
        sendMessage(VH, SetTip_Message, Integer(self.Handle), Integer(pchar(strtip)));
      end
      else
      begin
        showmessage('VH=0');
      end;
    end;procedure TForm1.btn13Click(Sender: TObject);
    var
      strtip:string;
    begin
      strtip:='正在加载Clip...';
      vH := findwindow('TfrmProgressbar', 'frmProgressbar');
      if vH > 0 then
      begin
        Clipboard.AsText := strtip;
        sendMessage(VH, SetTipClip_Message, Integer(self.Handle), 1);
      end
      else
      begin
        showmessage('VH=0');
      end;
    end;end.
      

  16.   

    在多线程中使用ADOQuery是不安全的
    微软有具体的说明
    应对方法是每个线程要有自己的独立的connection,而不要与其它线程公用connection你可以做个测试
    两个线程公用一个connection同时向某个数据表批量插入数据,结果过导致数据丢失
      

  17.   

    是borland不是微软Data access components are thread-safe as long as each thread has its own database session component. The one exception to this is when you are using Access drivers. Access drivers are built using the Microsoft ADO library, which is not thread-safe.
    ……If you create a single application that uses multiple threads to perform database operations, you must create one additional session for each thread.