Я пытаюсь показать заставку, а не замораживать приложение, пока оно подключается к базе данных. Обычные подключения (к MSSQL через ADO) занимают около 300 мс, и это не приводит к тому, что основной поток показывает «не отвечает» в окнах.
Однако в случае (а) сетевой ошибки или (б) ошибки конфигурации (недопустимое имя хоста / экземпляра SQL-сервера) время ожидания истекает через 60 секунд. Это не только делает приложение невосприимчивым, но и практически невозможно показать какую-либо ошибку или сообщение, когда оно собирается зависнуть. Я мог бы вывести сообщение перед установкой соединения, но на самом деле нет решения, когда основной поток блокируется на 60 секунд.
Похоже, решение состоит в том, чтобы переместить соединение в фоновый поток. Это привело к следующему коду:
класс TThread, который устанавливает фоновое соединение, и некоторый SyncObj, например TEvent, используемый для отправки сигнала обратно в основной поток.
Цикл в основном потоке с этим кодом:
BackgroundThread.StartConnecting; while not BackgroundThread.IsEventSignalled do begin Application.ProcessMessages; // keep message pump alive. end; // continue startup (reports error if db connection failed)
Это правильный путь? Мои сомнения связаны со следующими элементами вышеуказанного решения:
А. Я бы вызвал Application.ProcessMessages, что считаю сильным запахом кода (это может быть допустимым исключением из этого правила).
Б. Я добавляю потоки при запуске приложения и беспокоюсь о том, чтобы внести ошибки.
Если у кого-то есть эталонная реализация, которая, как известно, не содержит условий гонки, может выполнять фоновое соединение с ADO и считается безопасным подходом, это было бы действительно полезно. В остальном общие советы или частичные примеры хороши.