Опитвам се да покажа начален екран и да не блокирам приложението, докато се свързва с база данни. Нормалните връзки (към MSSQL чрез ADO) отнемат около 300 msec и това не кара основната нишка да показва „не отговаря“ на Windows.
Въпреки това, в случай на (а) мрежова грешка или (б) грешка в конфигурацията (невалидно име на хост/екземпляр на 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, което считам за екстремна миризма на код. (Това може да е допустимо изключение от това правило)
B. Въвеждам нишки при стартиране на приложение и се притеснявам от въвеждане на грешки.
Ако някой има референтна реализация, за която е известно, че е свободна от състезателни условия, която може да направи фонова връзка с ADO и е известно, че е безопасен подход, това би било наистина полезно. В противен случай общите съвети или частичните примери са добри.