我在用ADOQUERY查询数据时,可能数据量比较大,要一分钟,能不能采用多线程,在查询数据的同时,可以做别的数据.现在查询时,不能动,一动好像死机似的.白屏.

解决方案 »

  1.   

    当然可以!建立新线程运行adoquery.execute.
      

  2.   


    function ThreadQueryFunc(lpParameter:Pointer): Integer; stdcall;
    var
      adoconn:TAdoConnection;
      adoquery:TAdoQuery;
    begin
      //
      adoconn:=TAdoConnection.create(nil);
      ......
    end;    
    //线程执行
    AThreadId:DWORD;
    CreateThread(nil, 0, @ThreadQueryFunc, nil, 0, AThreadId);
      

  3.   

    TQueryThread = class(TThread)
        private
          procedure Query;
        protected
          procedure Execute;override;
      end;
    //Query的实现部分
    procedure TQueryThread.Query;
    begin
      with form1.ADOQUERY do
      ...
    end;procedure TQueryThread.Execute;
    var
     i : integer;
    begin
      inherited;
        Synchronize(Query);
    end;
      

  4.   

    如果你对api及windows的东西还不是很熟悉还是不要用CreateThread方式来做线程了,还是利用delphi封装的TThread类吧.
    待费旗 给出了一段示例了。我补充下:
    1.上面的代码只可能解决界面的不响应问题,并不能提高执行效率,因为Synchronize方法是把过程放在主线程里执行的.
    2.你可以把form1.ADOQUERY在线程类的Create里传入(重载create),然后在execute里对它进行操作.
    3.对于界面元素的操作,你可以把它放到Synchronize方法里.这样有利用同步和效率.
      

  5.   

    ADOQUERY 在线程 有可能会出错,LZ一定要注意