Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos!
Tenho um aplicativo de importação de dados para um DB PostgreSQL. O aplicativo funciona perfeitamente.
No final do processo, porém, executo uma Store procedure do PostgreSQL que demora uns 10 minutos (consolidação dos dados). Porém durante esse período, o sistema paralisa, como se estivesse travado.
Alterando o ExecutionOptions da TADOQuery para [eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking] eu consigo executar de forma assíncrona (e no caso, se houver mais alguns processos depois... ele ocorrem normalmente).
Meu objetivo é o seguinte... executar o processo de forma assíncrona só para não paralisar o programa, e ficar exibindo uma mensagem ou loading até o processo acabar.
ps.: sei que existe o evento OnFetchProgress e OnFetchComplete.... porém não sei como encaixá-lo sistema.
Segue o bloco de código onde chamo para executar a procedure:
// Executa Stored Procedure que atualiza Eclifor e Ecodrev QTITU
mmLog.Lines.Add(' ');
mmLog.Lines.Add('>> Store Procedure QTitu iniciada: ' + DateTimeToStr(Now));
aNiveis[1] := 'Store Procedure updCodRevQtitu-sem-gatilho()';
SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS);pgQExec.ExecuteOption := [eoAsyncExecute, eoAsyncFetchNonBlocking];
pgQExec.Close;
pgQExec.SQL.Clear;
pgQExec.SQL.Add('SELECT * FROM "DBPG"."DBConsolide"();'); on E: Exception do logErro(E.Message + #13 + sSQL);
end;
pgQExec.Close;
Application.ProcessMessages;pgQExec.ExecuteOption := [eoExecuteNoRecords];
SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
mmLog.Lines.Add('>> Store Procedure QTitu concluída: ' + DateTimeToStr(Now));
mmLog.Lines.Add('-----------------------------------------------------------------------------------------');
Desde já agradeço qualquer ajuda.
Carregando comentários...