怎样动态创建多线程???(88分)

  • 主题发起人 主题发起人 红金
  • 开始时间 开始时间

红金

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了个简单的例子。
unit Unit2;
interface
uses
Classes,Db, DBTables,StdCtrls, SysUtils;
type
j = class(TThread)
private
query:Tquery;
protected
procedure Execute;
override;
end;

implementation
procedure j.Execute;
begin
freeonterminate:=true;
query:=Tquery.Create(nil);
query.DatabaseName:='delphi';
with querydo
begin
close;
sql.Clear ;
sql.text:='select * from abc';
open;
end;
if terminated then
exit;
end;

end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
th:array[1..10] of TThread;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 10do
th:=j.Create(false);
end;
end.
调用时创建一个线程可以,动态创建10个时出错??
不知为什么??请各位大侠帮忙!!!
 
应该是线程间有冲突,我再看看吧。
 
什么冲突?
 
小弟很急,请各位大侠帮忙!!!
 
将你的数据库操作部分用抽取出来,做成一个过程,
用synchronize调用。
可以参见synchronize的Help
 
用synchronize还是出错?
我的线程是要搓开的,一个一个的创建,不是一起创建的。???
 
th:array[1..10] of TThread;
改为th:array[1..10] of j;
你th的定义有问题
剩下的同意polygon的意见
如果还不行再说
type
j = class(TThread)
private
query:Tquery;
proceduredo
query;
protected
procedure Execute;
override;
end;

implementation

procedure j.doquery;
begin
query:=Tquery.Create(nil);
query.DatabaseName:='delphi';
with querydo
begin
close;
sql.Clear ;
sql.text:='select * from abc';
open;
end;
end;

procedure j.Execute;
begin
freeonterminate:=true;
synchronize(doqurey);
if terminated then
exit;
end;

 
查看了一下资料,如果解决此问题必须加入Tsession控件
原理较复杂,但实现很简单,只需database指向session即可
 
添加一个Session控件,将Query的Sessionname属性设置为一个Session控件的名字
 
接受答案了.
 
可是这样对数据库又该如何操作。
如何让各线程之间独立分开?
 

Similar threads

后退
顶部