线程中怎么用Adoquery?(50分)

  • 主题发起人 没理头号
  • 开始时间

没理头号

Unregistered / Unconfirmed
GUEST, unregistred user!
线程中怎么用Adoquery?
我要在线程中用Adoquery,好比是我用一个系列的Adoquery,我要在程中用Adoquery.refresh,
但是在线程结束时老是报msado.dll访问出错,这是怎么回事啊?
能告诉我怎么才能在线程中安全使用adoquery吗?
 
给你一个例子。
仿照D4编程技术内幕的
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls, DBTables;
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
Query1: TADOQuery;
Button2: TButton;
Session1: TSession;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TQueryThread = class(TThread)
//FSession: TSession;
FQuery: TADOQuery;
FDataSource: TDataSource;
FQueryException: Exception;
procedure ConnectDataSource;
procedure ShowQryError;
protected
procedure Execute;
override;
public
constructor Create(Query: TADOQuery;
DataSource: TDataSource);virtual;
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure RunBackgroundQuery(Query: TADOQuery;DataSource: TDataSource);
begin
TQueryThread.Create(Query,DataSource);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DataSource1.DataSet := Query1;
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from users order by ID');
Open;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
try
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from users order by ID');
RunBackgroundQuery(Query1, DataSource1);
except
end;
end;

{ TQueryThread }
procedure TQueryThread.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;
end;

constructor TQueryThread.Create( Query: TADOQuery;
DataSource: TDataSource);
begin
inherited Create(True);
FQuery := Query;
FDataSource := DataSource;
FreeOnTerminate := True;
Resume;
end;

procedure TQueryThread.Execute;
begin
try
FQuery.Open;
Synchronize(ConnectDataSource);
except
FQueryException := ExceptObject as Exception;
Synchronize(ShowQryError);
end;
end;

procedure TQueryThread.ShowQryError;
begin
Application.ShowException(FQueryException);
end;

end.
 
还是
initialization
CoInitialize(nil);
end.
的问题,呵呵
 
to 教父:
你说的这个东东怎么用啊?
给个例子吧?
急救啊?程序明天就要交货了,就卡在这了,C/S都是这样,快快快啊?
 
大哥,好象不行啊?
我现在的问题是,
我程序一开始生成了一系列的adoquery,
以后我在线程中只是adoquery.refresh一下得到最新数据,
好象运行没问题,但是线程结束时老是会出错,不知为什么?
 
Synchronize(p.FQuery.Refresh);
//获得刷新数据
if (p.FRecNo >= p.FQuery.RecordCount) then
continue;
//没有新数据
好象一加上面第二句在线程退出时就出访问msadrh15.dll出错,为什么?
 
to 教父:
CoInitialize(nil); 能防止线程中ado冲突吗? 你试过吗?
反正我试下来失败了。 再加上delphi帮助中明确说ado组件非线程安全的。 所以安全的用法还是确保只有一个线程在执行ado调用。
 
所谓的非线程安全是指在ADO组件在线程外创建的,而如果在线程中创建的就不存在什么安不
安全的问题。
to 没理头号:在你的线程单元的最后部分加入上面的代码就行了。
 
接受答案了.
 
顶部