Mostrar uma tela inicial enquanto uma conexão de banco de dados (que pode levar muito tempo) é executada

Eu estou tentando mostrar uma tela inicial e não congelar o aplicativo, enquanto ele se conecta a um banco de dados. Conexões normais (para MSSQL via ADO) demoram cerca de 300 ms, e isso não faz com que o segmento principal mostre "não respondendo" no windows.

No entanto, no caso de (a) um erro de rede ou (b) um erro de configuração (nome / instância de host do servidor SQL inválido), leva 60 segundos para expirar. Isso não apenas torna a aplicação não responsiva, mas é quase impossível mostrar qualquer erro ou mensagem quando ela for congelar. Eu poderia abrir uma mensagem antes de iniciar a conexão, mas realmente não há solução quando o thread principal é bloqueado por 60 segundos.

A solução parece ser mover a conexão para um thread de segundo plano. Isso leva ao seguinte código:

uma classe TThread que faz a conexão de background e algum SyncObj como um TEvent usado para enviar um sinal de volta ao thread principal.

Um loop no thread principal com este código:

BackgroundThread.StartConnecting;
while not BackgroundThread.IsEventSignalled do begin
   Application.ProcessMessages; // keep message pump alive.
end;
// continue startup (reports error if db connection failed)

Este é o caminho certo a seguir? Minhas hesitações envolvem os seguintes elementos da solução acima:

A. Eu estaria chamando Application.ProcessMessages, que eu considero um cheiro de código extremo (isso pode ser uma exceção permissível a essa regra)

B. Estou introduzindo tópicos na inicialização de um aplicativo e estou preocupado com a introdução de bugs.

Se alguém tiver uma implementação de referência que seja conhecida como livre de condições de corrida, que possa estabelecer uma conexão de plano de fundo com o ADO e que seja conhecida como uma abordagem segura, isso seria realmente útil. Caso contrário, dicas gerais ou exemplos parciais são bons.

questionAnswers(2)

yourAnswerToTheQuestion