我在用兩個線程同時查詢一個數據表的時候會報錯,請問各位大哥是什麼原因(10分)

  • 主题发起人 主题发起人 gemmy
  • 开始时间 开始时间
G

gemmy

Unregistered / Unconfirmed
GUEST, unregistred user!
我查的時候每個線程都用獨立的query
有時只要有先後就沒事,一起時就出錯
 
有可能是表被锁定,出现超时错。
 
下 select 沒有鎖定
我試過
只是把撈回的資料作處理的時候會有出錯
 
能不能说错误提示
 
用互斥
WaitForSingleObject(hMutex,INFINITE)
 
好像ADOConnection非线程安全
 
TThreadQuery = class(TThread) { 声明线程类 }
private
FQuery: TQuery;
{ 线程中的查询组件 }
FDataSource: TDataSource;
{ 与查询组件相关的数据感知组件 }
procedure ConnectDataSource;{ 连接数据查询组件和数据感知组件的方法 }
protected
procedure Execute;
override;{ 执行线程的方法 }
public
constructor Create(Query: TQuery;
DataSource: TDataSource);
virtual;
{ 线程构造器 }
end;


var
Form1: TForm1;
Q1, { 线程查询对象1 }
Q2: TThreadQuery;
{ 线程查询对象2 }
i: Integer;

implementation
{$R *.dfm}
{ TThreadQuery }
procedure TThreadQuery.ConnectDataSource;
begin
FDataSource.DataSet := FQuery;
end;

constructor TThreadQuery.Create(Query: TQuery;
DataSource: TDataSource);
begin
FQuery := Query;
FDataSource := DataSource;
Inherited Create(True);
FreeOnTerminate := False;
end;

procedure TThreadQuery.Execute;
begin
Try
FQuery.Open;
Synchronize(ConnectDataSource);{ 线程同步 }
except
ShowMessage('Query Error');
{ 线程异常 }
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Q1 := TThreadQuery.Create(Query1,DataSource1);
Q2 := TThreadQuery.Create(Query2, DataSource2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Q1.Terminate;
{ 销毁之前终止线程执行 }
Q1.Destroy;
Q2.Terminate;
{ 销毁之前终止线程执行 }
Q2.Destroy;
end;

procedure TForm1.BtnGoPauseClick(Sender: TObject);
begin
if Q1.Suspended then
Q1.Resume else
Q1.Suspend;
if Q2.Suspended then
Q2.Resume else
Q2.Suspend;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DataSource1.DataSet := Query1;
DataSource2.DataSet := Query2;
Query1.Open;
Query2.Open;
end;
 
严重反对楼上!
原则错误!!!
BDE怎样实现多线程的?一定要基于多Session.
只是简单的把Query放在线程里面就叫做多线程呀?!
呵呵!哈哈!
 
后退
顶部