form1.ADOConnection3.close;
   sa:=ExtractFilePath(ParamStr(0))+'table\'+form1.stringgrid4.cells[0,ix]+' access\'+'shuju.mdb';
  form1.ADOConnection3.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sa;
   form1.ADOConnection3.Open;
    ss3:=ExtractFilePath(ParamStr(0))+ Z\'+form1.stringgrid4.cells[0,ix];
        sql:= 'INSERT INTO B ';
     sql:=sql+'SELECT * From [Text;DATABASE='+ss3+'].['+ss4+']';      form1.ADOQuery3.SQL.Clear;
       form1.ADOQuery3.SQL.Add(sql);
      form1.ADOQuery3.ExecSQL;-------
请问以上 代码 是否需要 Synchronize 呢?

解决方案 »

  1.   

    线程中访问VCL控件都需要Synchronize,我觉得需要。
      

  2.   

    如果你的adoquery,adoconnection都是在线程中建立的,可以不用sync同步。
    如果你的adoquery是主线程的,就一定需要。
      

  3.   

    就是在 FORM1里托了 3个 ADOQUERY控件看来得放到线程里建立了
    数据量大 百万 没法对传得对不对。。
      

  4.   

    建立了 3个线程一个线程 Synchronize,另外两个都不动了   
      

  5.   

    你应该是用synchronize的时候处理事件太多了,
      

  6.   

    应该是对窗体类控件操作的时候才需要synchronize,不知道对不对?
      

  7.   

    synchronize的意义,是它指定的procedure中的代码,在主线程的上下文中被执行,当前线程被挂起。所以,在synchronize中执行query的open语句读取数据,没有意义,因为根本没有用到多线程的好处;open语句应该在线程的Execute中执行。如果主线程,在子线程的执行过程中,不使用连接控件,则不需要在子线程中创建连接控件,直接使用form中的连接控件即可;否则,需要在子线程中创建、使用和释放独立的连接控件。至于query控件,因为它们是与TDBgrid等数据感知控件相关联的,而这些数据感知控件,才是只能由主线程来访问的控件,query控件只是被主线程间接访问。所以,在子线程执行过程中,应该取消query与数据感知控件的关联,待数据返回完成之后,再重新建立关联,这样就不会有资源访问冲突。synchronize不是必须的。
      

  8.   

    只要你的ADO引用在界面上面了, 就得要用synchronize. 
    假如你的ADO没有在界面上使用, 而单独只有线程里面用, 可以不用, 直接打开数据回来即可. 然后可以通过消息告知外界可以引用ADO建立树形了.