Как сохранить отзывчивость программы при выполнении Anydac Query?

С sdac я могу позволить программе реагировать на ввод пользователя как:

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

Как реализовать тот же код с запросом anydac (нет аналогичной функции)?

Я использую delphi xe2 и anydac v6.

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 блок), но не блокирует графический интерфейс (он игнорирует события клавиатуры и мыши, подумал.)

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

Для получения дополнительной информации см. Документацию на веб-сайте разработчика: Асинхронное выполнение.

Другие вопросы по тегам