我正在尝试显示启动屏幕,而不是在应用程序连接到数据库时冻结它。正常连接(通过 ADO 到 MSSQL)大约需要 300 毫秒,这不会导致主线程在 Windows 上显示“无响应”。
但是,在 (a) 网络错误或 (b) 配置错误(无效的 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)
这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:
A. 我会调用 Application.ProcessMessages,我认为这是一种极端的代码气味。(这可能是该规则的允许例外)
B. 我在应用程序的启动中引入线程,我担心引入错误。
如果有人有一个已知没有竞争条件的参考实现,它可以与 ADO 进行后台连接,并且已知是一种安全的方法,那将非常有帮助。否则一般提示或部分示例都很好。