如何在执行DBExpress查询时保持程序对用户输入的响应?

ae1*_*080 3 delphi dbexpress

ibdac查询(http://www.devart.com/ibdac/components.html)有一个函数executing,我可以写一些像:

 while MyQuery.Executing do
 begin
   application.ProcessMessages;
   Sleep(1);
 end;
Run Code Online (Sandbox Code Playgroud)

如何使用dbexpress查询实现相同的代码(没有类似的功能)?

ood*_*ner 5

没有类似的功能.但是你可以在后台线程中执行MyQuery,主线程将在后台线程完成时等待.例如:

type
  TMyThread = class(TThread)
  private
    FQuery: TSQLQuery;
  protected
    procedure Execute; override;
  public
    constructor Create(AQuery: TSQLQuery);
  end;

constructor TMyThread.Create(AQuery: TSQLQuery);
begin
  inherited Create;
  FreeOnTerminate := False;
  FQuery := AQuery;
end;

procedure TMyThread.Execute;
begin
  FQuery.ExecSQL;
end;

var
  oThread: TMyThread;
....

  oThread := TMyThread.Create(MyQuery);
  try
    while not oThread.Finished do begin
      Application.ProcessMessages;
      Sleep(1);
    end;
  finally
    oThread.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

PS:顺便说一句,我正在使用AnyDAC.它具有内置的后台执行功能.

  • 由于SQL连接不是线程安全的,因此Query线程还应该接收自己的连接或连接工厂对象 (4认同)
  • 实际上,这个while循环对于`MsgWaitForMultipleObjects`来说是最好的,这样你就不必每隔几秒就唤醒一次来轮询标志.我讨厌民意调查,因为我认为普通访客不会很清楚.这样就可以避免需要一个Finished标志,只需要等到线程发出信号,然后在消息到达队列并进行处理时唤醒. (3认同)
  • 如果Query在一个线程中运行,则不需要ProcessMessage来保持用户界面的响应...... (2认同)