F
filter
Unregistered / Unconfirmed
GUEST, unregistred user!
初学多线程,我迷惑在以下几点:
1、我的队列类是自己写的,怎么加上队列锁,使多个线程读取一个队列不出问题,看了下tqueue,也不带队列锁
2、我是一个死循环读列队,判断队列是否有数据,有则读出,没有则继续循环,这样对系统消耗太大,CPU占用有100%了
3、线程在共同访问一个表时,需要用线程安全,资料上说应该加上Synchronize,晨同放一个datasource:=adoquery;datasource我没有用到,因为只需要ADOQUERY adoconnect就行了。这里线程安全是怎么做的。
type
TtestThread = class(TThread) //自定义线程
protected
qry: TADOQuery;
Ado: TADOConnection;
procedure Execute;
override;
procedure CreateConnectAdoProc;
//创建连接ADO
procedure OpenSqlProc;
//打开数据集
procedure ConnectDataSource;
end;
procedure TtestThread.CreateConnectAdoProc;
var
constr : string;
begin
Qry := TADOQuery.Create(nil);
Ado := TADOConnection.Create(nil);
Ado.ConnectionString := ado_oracle;
//连接ADO串
Ado.LoginPrompt:= false;
if not Ado.Connected then
Ado.Connected := True;
end;
procedure TtestThread.OpenSqlProc;
var
str:string;
begin
if Qry.Connection = nil then
Qry.Connection := Ado;
while truedo
//死循环,CPU占用太高
begin
WaitforsingleObject;
str:=kk.get();
if str<>'' then
begin
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Text := 'select * from ayjf';//strSql;
Qry.Prepared;
Qry.Open;
str:='';
end;
sleep(10);
end;
end;
procedure TtestThread.ConnectDataSource;
begin
//这里应该怎么写?
end;
procedure TtestThread.Execute;
var
strSql : string;
begin
inherited;
FreeOnTerminate := true;
CoInitialize(nil);
CreateConnectAdoProc;//创建连接ADO
strSql := 'select............';
//略
strsql:='update ....';
//略
OpenSqlProc;
//打开数据集
Synchronize(ConnectDataSource);
end;
procedure TfrmMain.Button2Click(Sender: TObject);
var
hThread:Thandle;
ThreadIDWord;
i:integer;
begin
//想提高速度,所以用多个线程
for i:=0 to 10do
TtestThread.create(false);
end;
麻烦高手请改下代码,多谢!
1、我的队列类是自己写的,怎么加上队列锁,使多个线程读取一个队列不出问题,看了下tqueue,也不带队列锁
2、我是一个死循环读列队,判断队列是否有数据,有则读出,没有则继续循环,这样对系统消耗太大,CPU占用有100%了
3、线程在共同访问一个表时,需要用线程安全,资料上说应该加上Synchronize,晨同放一个datasource:=adoquery;datasource我没有用到,因为只需要ADOQUERY adoconnect就行了。这里线程安全是怎么做的。
type
TtestThread = class(TThread) //自定义线程
protected
qry: TADOQuery;
Ado: TADOConnection;
procedure Execute;
override;
procedure CreateConnectAdoProc;
//创建连接ADO
procedure OpenSqlProc;
//打开数据集
procedure ConnectDataSource;
end;
procedure TtestThread.CreateConnectAdoProc;
var
constr : string;
begin
Qry := TADOQuery.Create(nil);
Ado := TADOConnection.Create(nil);
Ado.ConnectionString := ado_oracle;
//连接ADO串
Ado.LoginPrompt:= false;
if not Ado.Connected then
Ado.Connected := True;
end;
procedure TtestThread.OpenSqlProc;
var
str:string;
begin
if Qry.Connection = nil then
Qry.Connection := Ado;
while truedo
//死循环,CPU占用太高
begin
WaitforsingleObject;
str:=kk.get();
if str<>'' then
begin
Qry.Close;
Qry.SQL.Clear;
Qry.SQL.Text := 'select * from ayjf';//strSql;
Qry.Prepared;
Qry.Open;
str:='';
end;
sleep(10);
end;
end;
procedure TtestThread.ConnectDataSource;
begin
//这里应该怎么写?
end;
procedure TtestThread.Execute;
var
strSql : string;
begin
inherited;
FreeOnTerminate := true;
CoInitialize(nil);
CreateConnectAdoProc;//创建连接ADO
strSql := 'select............';
//略
strsql:='update ....';
//略
OpenSqlProc;
//打开数据集
Synchronize(ConnectDataSource);
end;
procedure TfrmMain.Button2Click(Sender: TObject);
var
hThread:Thandle;
ThreadIDWord;
i:integer;
begin
//想提高速度,所以用多个线程
for i:=0 to 10do
TtestThread.create(false);
end;
麻烦高手请改下代码,多谢!