运行数据库连接(可能需要很长时间)时显示启动画面

War*_* P 5 delphi multithreading ado

我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".

但是,在(a)网络错误或(b)配置错误(无效的SQL服务器主机名/实例)的情况下,超时需要60秒.这不仅使应用程序无响应,而且在它冻结时几乎不可能显示任何错误或消息.我可以在开始连接之前弹出一条消息,但是当主线程阻塞60秒时,确实没有解决方案.

解决方案似乎是将连接移动到后台线程.这导致以下代码:

  1. 一个TThread类,它使后台连接,一些SyncObj就像一个TEvent,用于将信号发送回主线程.

  2. 使用此代码的主线程中的循环:

    BackgroundThread.StartConnecting;
    while not BackgroundThread.IsEventSignalled do begin
       Application.ProcessMessages; // keep message pump alive.
    end;
    // continue startup (reports error if db connection failed)
    
    Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:

答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)

B.我在应用程序启动时引入了线程,我担心引入错误.

如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.

小智 4

由于每个线程必须使用它自己的 ADO 连接(即不能使用在其他线程中创建的连接对象)这一已知限制,我能想到的唯一选择是创建一个与数据库建立连接的线程,然后连接建立或达到超时,向主线程发出有关该事件的信号并关闭/销毁连接。主线程可以同时显示启动画面或进度,等待来自该线程的消息。因此,您可以消除密码错误或主机无法访问的情况。有一个合理的假设,即如果第二个线程可以连接,则主线程随后也可以连接。