War*_* P 5 delphi multithreading ado
我试图显示一个启动画面,而不是冻结应用程序,而它连接到数据库.正常连接(通过ADO到MSSQL)大约需要300毫秒,这不会导致主线程在窗口上显示"无响应".
但是,在(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)
Run Code Online (Sandbox Code Playgroud)这是正确的方法吗?我的犹豫涉及上述解决方案的以下要素:
答:我会调用Application.ProcessMessages,我认为这是极端的代码味道.(这可能是这个规则允许的例外)
B.我在应用程序启动时引入了线程,我担心引入错误.
如果任何人都有一个已知没有竞争条件的参考实现,那可以与ADO建立后台连接,并且已知这是一种安全的方法,这将非常有用.否则一般提示或部分例子都是好的.
小智 4
由于每个线程必须使用它自己的 ADO 连接(即不能使用在其他线程中创建的连接对象)这一已知限制,我能想到的唯一选择是创建一个与数据库建立连接的线程,然后连接建立或达到超时,向主线程发出有关该事件的信号并关闭/销毁连接。主线程可以同时显示启动画面或进度,等待来自该线程的消息。因此,您可以消除密码错误或主机无法访问的情况。有一个合理的假设,即如果第二个线程可以连接,则主线程随后也可以连接。