Я пытаюсь показать заставку, а не зависать приложение, пока оно подключается к базе данных. Обычные подключения (к MSSQL через ADO) занимают около 300 мс, и это не приводит к тому, что основной поток показывает «не отвечает» в Windows.
Однако в случае (а) сетевой ошибки или (б) ошибки конфигурации (неверное имя хоста/экземпляра SQL-сервера) истечение времени ожидания занимает 60 секунд. Это не только делает приложение невосприимчивым, но и почти невозможно показать какую-либо ошибку или сообщение, когда оно зависнет. Я мог бы вывести сообщение перед тем, как начать соединение, но на самом деле нет решения, когда основной поток блокируется на 60 секунд.
Похоже, решение состоит в том, чтобы переместить соединение в фоновый поток. Это привело к следующему коду:
класс TThread, который создает фоновое соединение, и некоторый SyncObj, например TEvent, используемый для отправки сигнала обратно в основной поток.
Цикл в основном потоке с таким кодом:
BackgroundThread.StartConnecting;
пока не начинается BackgroundThread.IsEventSignalled
Приложение.ПроцессСообщения; // поддерживать помпу сообщений в рабочем состоянии.
конец;
// продолжить запуск (сообщает об ошибке, если соединение с БД не удалось)
Это правильный путь? Мои сомнения касаются следующих элементов приведенного выше решения:
A. Я бы назвал Application.ProcessMessages, которые я считаю экстремальным запахом кода. (Это может быть допустимым исключением из этого правила)
B. Я добавляю потоки в запуск приложения и беспокоюсь о появлении ошибок.
Если у кого-то есть эталонная реализация, которая, как известно, не содержит условий гонки, может выполнять фоновое подключение к ADO и известна как безопасный подход, это было бы действительно полезно. В противном случае общие советы или частичные примеры хороши.