【问题标题】:How to keep a program responsive while executing Anydac Query?如何在执行 Anydac Query 时保持程序响应?
【发布时间】:2012-12-31 01:00:20
【问题描述】:

有了sdac,我可以让程序响应用户输入:

while Query.Executing do
begin
  Application.ProcessMessages;
  Sleep(1);
end;

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

我正在使用 delphi xe2 和 anydac v6。

【问题讨论】:

  • 您不应该像这样使用ProcessMessages(),无论您使用 sdac 还是 anydac 或其他任何东西。您应该将冗长的阻塞操作(例如数据库查询)移到它们自己的单独线程中,并且根本不要阻塞主线程。
  • 快速查看 da-soft 的文档并没有显示任何方法可以做到这一点,但您确实应该询问他们的支持部门。 (而且不管它在做什么,你的代码都非常糟糕;对sleep(1) 的调用使用了很高比例的 CPU,除了一次又一次调用ProcessMessages 之外什么都不做,这使得 other 应用程序变慢也回应。)
  • @Fred:不,他发布的代码适用于 Devart;他正在尝试解决 da-soft 的 Anydac 的问题。再次阅读问题,并检查问题中发布的链接。

标签: delphi delphi-xe2 anydac


【解决方案1】:

AnyDAC 支持不同的执行模式。要检查当前操作状态,请使用ADQuery1.Command.State。这是伪代码(我这里没有 Delphi):

ADQuery1.ResourceOptions.CmdExecMode := amAsync;
ADQuery1.Open;
while ADQuery1.Command.State = csExecuting do
begin
    // This is NOT RECOMMENDED
    Application.ProcessMessages;
    Sleep(1);
end;

但是,由于您在 while 块中所做的唯一事情是处理 GUI 消息,我认为您最好的选择是使用 amNonBlocking 模式,该模式将等待查询完成(从而避免 while块)但不阻止 GUI(它确实忽略了键盘和鼠标事件,我想。)

ADQuery1.ResourceOptions.CmdExecMode := amNonBlocking;
ADQuery1.Open;

有关详细信息,请参阅开发者网站中的文档:Asynchronous Execution

【讨论】:

  • 我更新了您删除后的事件处理程序并添加了命令状态检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多