delphi 
程序将共用TDataModule上一个ADOConnection;
ADOConnection连接数据库时(特别是配置出错或者SQL Server无响应时)程序几乎停滞,怎样让ADOConnection连接时不影响程序做其他事情,用多线程怎样保证线程安全。

解决方案 »

  1.   

    连接出错时就是有一段停滞时间,delphi里面测试连接的时候也一样。
    程序公用的Adoconnection都连不上,你的程序还需要做什么其他事?
    可以用多线程,比如连接的过程写到线程中,连接状态返回到主窗体或者等待窗体,没什么线程安全不安全的问题,你连不上数据库,顶多其他功能不能用。
      

  2.   

    jieguo 的话也有道理
    希望有更多的答案,最好有个多线程的解决办法。谢谢
      

  3.   

    建议可以用其他连接数据库,
    比如ADODateSet
      

  4.   

    现在有3种方法:
       1.Application.ProcessMessages;
         adoconMain.Close;
         adoconMain.connectionstring:=...;
         Application.ProcessMessages;        <---------- 这里或者其他地方,能做到只有连接时无响应
         adoconMain.Connected:=True;
       2.多线程中测试能正常连接数据库,再让adoconMain连接。     
         procedure TThreadConSer.Execute;
         begin
           inherited;
           ...
           CoInitialize(NULL); 
           try
             adoconTest.Connected:=True;
             dmMain.ConnectMode:=cmOK;  <-----
           except
             dmMain.ConnectMode:=cmNo;  <-----  通过ConnectMode知道现在是否能够连接。感觉这是目前为止想到最好的办法
            end;
           CoUnInitialize;
           ...      
         end;
       3.直接通过线程连接。
          procedure TThreadConSer.Execute;
         begin
           inherited;
           ...
           CoInitialize(NULL); 
           try
             adoconMain.Connected:=True;
           except
             ...
            end;
           CoUnInitialize;
           ...
         end;         <-------------这样就没第2个那么麻烦,但是会不会有线程不安全不稳定之类的后顾之忧啊。------------------------------------------------------------------
    帮看下这3个方法能行不或者存在的问题,更期待有更加完美的答案,谢谢大家参与探讨!
      

  5.   

    在线程里来处理,如果你只创建一个这个线程类的对象的话是没有冲突的。
    如果有多个这个线程启动的可能,那就把连接过程放到Synchornize里