在线程中操作 ADOQUERY 是否需要Synchronize

lzhqlj2011 2011-07-08 09:44:01
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 呢?
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfasri 2011-07-12
  • 打赏
  • 举报
回复
只要你的ADO引用在界面上面了, 就得要用synchronize.
假如你的ADO没有在界面上使用, 而单独只有线程里面用, 可以不用, 直接打开数据回来即可. 然后可以通过消息告知外界可以引用ADO建立树形了.
「已注销」 2011-07-09
  • 打赏
  • 举报
回复
应该是对窗体类控件操作的时候才需要synchronize,不知道对不对?
Mit1208 2011-07-09
  • 打赏
  • 举报
回复
你应该是用synchronize的时候处理事件太多了,
lzhqlj2011 2011-07-09
  • 打赏
  • 举报
回复
建立了 3个线程

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

lzhqlj2011 2011-07-09
  • 打赏
  • 举报
回复
就是在 FORM1里托了 3个 ADOQUERY控件

看来得放到线程里建立了
数据量大 百万 没法对传得对不对。。。。。。。。。。。
haochin 2011-07-09
  • 打赏
  • 举报
回复
如果你的adoquery,adoconnection都是在线程中建立的,可以不用sync同步。
如果你的adoquery是主线程的,就一定需要。
董董 2011-07-09
  • 打赏
  • 举报
回复
synchronize的意义,是它指定的procedure中的代码,在主线程的上下文中被执行,当前线程被挂起。所以,在synchronize中执行query的open语句读取数据,没有意义,因为根本没有用到多线程的好处;open语句应该在线程的Execute中执行。

如果主线程,在子线程的执行过程中,不使用连接控件,则不需要在子线程中创建连接控件,直接使用form中的连接控件即可;否则,需要在子线程中创建、使用和释放独立的连接控件。

至于query控件,因为它们是与TDBgrid等数据感知控件相关联的,而这些数据感知控件,才是只能由主线程来访问的控件,query控件只是被主线程间接访问。所以,在子线程执行过程中,应该取消query与数据感知控件的关联,待数据返回完成之后,再重新建立关联,这样就不会有资源访问冲突。

synchronize不是必须的。
shijies 2011-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lzhqlj2011 的回复:]
建立了 3个线程

一个线程 Synchronize,另外两个都不动了
[/Quote]

线程共用资源需要同步。
shijies 2011-07-08
  • 打赏
  • 举报
回复
线程中访问VCL控件都需要Synchronize,我觉得需要。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧