Показывать заставку во время подключения к базе данных (это может занять много времени)

Я пытаюсь показать заставку, а не зависать приложение, пока оно подключается к базе данных. Обычные подключения (к MSSQL через ADO) занимают около 300 мс, и это не приводит к тому, что основной поток показывает «не отвечает» в Windows.

Однако в случае (а) сетевой ошибки или (б) ошибки конфигурации (неверное имя хоста/экземпляра SQL-сервера) истечение времени ожидания занимает 60 секунд. Это не только делает приложение невосприимчивым, но и почти невозможно показать какую-либо ошибку или сообщение, когда оно зависнет. Я мог бы вывести сообщение перед тем, как начать соединение, но на самом деле нет решения, когда основной поток блокируется на 60 секунд.

Похоже, решение состоит в том, чтобы переместить соединение в фоновый поток. Это привело к следующему коду:

  1. класс TThread, который создает фоновое соединение, и некоторый SyncObj, например TEvent, используемый для отправки сигнала обратно в основной поток.

  2. Цикл в основном потоке с таким кодом:

    BackgroundThread.StartConnecting;
    пока не начинается BackgroundThread.IsEventSignalled
    Приложение.ПроцессСообщения; // поддерживать помпу сообщений в рабочем состоянии.
    конец;
    // продолжить запуск (сообщает об ошибке, если соединение с БД не удалось)
    

Это правильный путь? Мои сомнения касаются следующих элементов приведенного выше решения:

A. Я бы назвал Application.ProcessMessages, которые я считаю экстремальным запахом кода. (Это может быть допустимым исключением из этого правила)

B. Я добавляю потоки в запуск приложения и беспокоюсь о появлении ошибок.

Если у кого-то есть эталонная реализация, которая, как известно, не содержит условий гонки, может выполнять фоновое подключение к ADO и известна как безопасный подход, это было бы действительно полезно. В противном случае общие советы или частичные примеры хороши.

5
задан Warren P 21 May 2012 в 00:58
поделиться

0 ответов

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

Похожие вопросы: