关于线程编程中资源访问的问题???急

hq007 2007-06-09 10:11:07
用Delphi6写了很简单的线程程序,有两个单元unit1(主程序单元),ThreadUnit(线程单元) ,两个单元都相互 uses 了对方。然后我在unit1中添加了一个ADOConnection和一个ADOQuery组件,经过测试,如果在unit单元中调用adoquery是没有问题的,也就是说 adoquery.open 可以返回数据集。

但是我在ThreadUnit的Execute方法中调用了unit1中的adoquery组件,代码是这样的:
......
with mainform do //mainform 是unit1单元的窗体
begin
adoquery.close;
adoquery.sql.text:='select No from StdList';
try
adoquery.open;
except
listbox1.items.add('Open DataSet Error!');
end;
end
.....


经过跟踪发现adoquery在ThreadUnit但是打开是失败的,请问各位大哥大姐这是什么原因啊,想了很久都没想通!请大家帮一下忙,谢谢了!





...全文
192 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
imho888 2007-06-13
  • 打赏
  • 举报
回复
//自己动态创建一个不就行了
var
iQuery:TADOQuery;
.......................
iQuery:= TADOQuery.Create(nil);
try
......
iQuery.close;
iQuery.sql.text:='select No from StdList';
try
iQuery.open;
except
listbox1.items.add('Open DataSet Error!');
end;
.....
finally
freeandnil(iQuery);
end;
hq007 2007-06-13
  • 打赏
  • 举报
回复
动态创建我也试过了,也不行啊!而且你这个代码有点小问题!少了一个连接数据库的语句

//自己动态创建一个不就行了
var
iQuery:TADOQuery;
.......................
iQuery:= TADOQuery.Create(nil);
iQuery.connectstring:=MainForm.CONN; //因为使用主窗体的VCL,所以还是要使用Synchronize来同步
try
......
iQuery.close;
iQuery.sql.text:='select No from StdList';
try
iQuery.open;
except
listbox1.items.add('Open DataSet Error!');
end;
.....
finally
freeandnil(iQuery);
end;
graycarl 2007-06-13
  • 打赏
  • 举报
回复
VCL中ado组件封装了COM组件操作
封装代码中并没有考虑跨线程使用情况,COM接口无法直接跨线程中使用(需要进行Marshal),
尝试只在ThreadUnit的Execute中动态创建和使用ADO组件(需要在之前调用CoInitialize[Ex])。
另外,线程代码里不应该使用listbox1.items.add('Open DataSet Error!'); 应该将更新窗口的代码放在一个单独方法里并通过Synchronize方法执行,以让它在窗口所属线程上执行。
chinawcs 2007-06-11
  • 打赏
  • 举报
回复
你的情况 用楼上的方法应该能解决
wzn0521 2007-06-11
  • 打赏
  • 举报
回复
在线程中访问vcl,要使用Synchronize。
用法到网上搜一下吧
wzn0521 2007-06-11
  • 打赏
  • 举报
回复
要使用Synchronize
hq007 2007-06-10
  • 打赏
  • 举报
回复
请大家帮帮忙@

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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