在窗体的create事件中有个for循环。for i=1 to n(最多为3)。
在每个循环中都创建一个线程,在每个线程里创建一个数据连接ADOConnection(连不同数据源),个几个adoquery。
然后打开ADOConnection,打开每个adoquery。... 然后关闭adoquery,ADOConnection。再释放线程。
即创建线程,执行某操作后,再释放线程(如果没有线程,则ADOConnection连续创建,但我要ADOConnection并发创建)。请问:在for循环中创建线程,能做到吗???如能,请你们把代码奉上。无限感谢!!!(不需要创建ADOConnection和adoquery)
在每个循环中都创建一个线程,在每个线程里创建一个数据连接ADOConnection(连不同数据源),个几个adoquery。
然后打开ADOConnection,打开每个adoquery。... 然后关闭adoquery,ADOConnection。再释放线程。
即创建线程,执行某操作后,再释放线程(如果没有线程,则ADOConnection连续创建,但我要ADOConnection并发创建)。请问:在for循环中创建线程,能做到吗???如能,请你们把代码奉上。无限感谢!!!(不需要创建ADOConnection和adoquery)
var
i: Integer;
begin
for i := 0 to n do
TMyThread.Create(False);
end;为了方便生成的线程管理,可以定义一个Tlist来放生成的线程
TThreadList :TList;
TThreadList := TList.create;var
i: Integer;
begin
for i := 0 to n do
TThreadList.Add(TMyThread.Create(False));
end;
但小第刚学线程,不是很明,请你把整个unit写出来好吗?拜托了!!!!
zxr = class(TThread)
private
procedure SetName;
protected
procedure Execute; override;
end;implementation
uses unit1;{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example, Synchronize(UpdateCaption); and UpdateCaption could look like, procedure zxr.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }{$IFDEF MSWINDOWS}
type
TThreadNameInfo = record
FType: LongWord; // must be 0x1000
FName: PChar; // pointer to name (in user address space)
FThreadID: LongWord; // thread ID (-1 indicates caller thread)
FFlags: LongWord; // reserved for future use, must be zero
end;
{$ENDIF}{ zxr }procedure zxr.SetName;
{$IFDEF MSWINDOWS}
var
ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
ThreadNameInfo.FType := $1000;
ThreadNameInfo.FName := 'zxr';
ThreadNameInfo.FThreadID := $FFFFFFFF;
ThreadNameInfo.FFlags := 0; try
RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
except
end;
{$ENDIF}
end;procedure zxr.Execute;
var
i,j,k:integer;
a:int64;
begin
SetName;
{ Place thread code here }
a:=0;
freeonterminate:=true;
form1.Canvas.Font.Size:=16;
form1.Canvas.Font.Name:='楷体';
form1.Canvas.TextOut(10,10,'正在用一个线程进行复杂的计算,这段时间,窗口会响应你的任何事件!');
for i:=0 to 200 do
for j:=0 to 200 do
for k:=0 to 20000 do
begin
a:=a+1;
end;
form1.Canvas.TextOut(10,10,' ');
form1.Canvas.TextOut(10,10,'结果为:'+inttostr(a));
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
ThreadList: TList;
public
{ Public declarations }
end; TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;var
Form1: TForm1;implementation{$R *.dfm}{ TMyThread }procedure TMyThread.Execute;
begin
inherited;
//线程的执行代码
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ThreadList := TList.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
const
n = 3;
var
i: Integer;
begin
for i := 1 to 3 do
ThreadList.Add(TMyThread.Create(False));
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
ThreadList.Free;
end;end.
procedure Tmythread.Execute;
var
lADOConnection:TADOConnection;
lADOQuery:TADOQuery;
begin
lADOConnection:=TADOConnection.Create(nil);
lADOQuery:=TADOQuery.Create(nil);
...
lADOQuery.Free;
lADOConnection.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 5 do
begin
TMythread.create(false);
end;
end;请问:我创建了线程,ADOConnection,ADOQuery。最后释放了ADOConnection,ADOQuery后,线程有没有释放的,怎释放的?
能否在下面就释放线程(即释放了数据集)?
procedure Tmythread.Execute;
var
lADOConnection:TADOConnection;
lADOQuery:TADOQuery;
begin
lADOConnection:=TADOConnection.Create(nil);
lADOQuery:=TADOQuery.Create(nil);
...
lADOQuery.Free;
lADOConnection.Free;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
ThreadList: TList;
public
{ Public declarations }
end; TMyThread = class(TThread)
private
{ Private declarations }
lADOConnection:TADOConnection;
lADOQuery:TADOQuery;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
end;var
Form1: TForm1;implementation{$R *.dfm}{ TMyThread }constructor TMyThread.Create;
begin
lADOQuery := TADOQuery.Create(nil);
lADOConnection := TADOConnection.Create(nil);
inherited Create(False);
end;destructor TMyThread.Destroy;
begin
if Assigned(lADOQuery) then
FreeAndNil(lADOQuery);
if Assigned(lADOConnection) then
FreeAndNil(lADOConnection);
inherited;
end;procedure TMyThread.Execute;
begin
inherited;
//线程的执行代码
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ThreadList := TList.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
const
n = 3;
var
i: Integer;
begin
for i := 1 to 3 do
ThreadList.Add(TMyThread.Create);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
ThreadList.Free;
end;end.
begin
ThreadList.Free;
end;
这个里面有错误,最后free的时候先把里面的线程给释放,删除掉。写的时候忘记了。
谢谢 Dlwxn(蓝天) 先。
刚才开会,下午试试。
不过最后用try...finally...end.
var
lADOConnection:TADOConnection;
lADOQuery:TADOQuery;
begin
lADOConnection:=TADOConnection.Create(nil);
lADOQuery:=TADOQuery.Create(nil);
...
lADOQuery.Free;
lADOConnection.Free;
//在次释放线程,因为上面的数据集已经释放了
end;而不是在线程释放后,释放数据集。
destructor TMyThread.Destroy;---------下面代码,我想是:线程释放后,就释放数据集。
begin
if Assigned(lADOQuery) then
FreeAndNil(lADOQuery);
if Assigned(lADOConnection) then
FreeAndNil(lADOConnection)
inherited;
end;