Unit getinfo;constructor getinfo.Create(h:string;vlist:TTreeview); //取id!!
begin
v:=h;
ViewList:=vlist;
FreeOnTerminate := True;
inherited create(false);
end;
function check(a:string):string;
begin
//…
form1.memo1.lines.add(a);
end;procedure getinfo.Execute;
begin
Check(v);
end;
创建线程代码Unit Unit1;
var
infothread:array of getinfo;procedure Tform1.Threadstop;
begin
//如果是这里应该添加什么代码,能让创建的线程立即停止
//我试过Terminate,Free 等都失败了
//出现过 句柄无效 或 程序卡死 或 直到线程将任务处理完成
//我想立即终止线程 让它不在工作 该在哪里添加代码
end;procedure Tform1.GetStart;
var
i,v: integer;
begin
SetLength(infothread,self.Memo1.Lines.Count); // 动态设置线程的数量
for i := 0 to self.Memo1.Lines.Count -1 do
begin
infothread[i] := getinfo.Create(self.Memo1.Lines.Strings[i],self.treeview1);
infothread[i].OnTerminate := Threadok;
end;
end;
end;
begin
v:=h;
ViewList:=vlist;
FreeOnTerminate := True;
inherited create(false);
end;
function check(a:string):string;
begin
//…
form1.memo1.lines.add(a);
end;procedure getinfo.Execute;
begin
Check(v);
end;
创建线程代码Unit Unit1;
var
infothread:array of getinfo;procedure Tform1.Threadstop;
begin
//如果是这里应该添加什么代码,能让创建的线程立即停止
//我试过Terminate,Free 等都失败了
//出现过 句柄无效 或 程序卡死 或 直到线程将任务处理完成
//我想立即终止线程 让它不在工作 该在哪里添加代码
end;procedure Tform1.GetStart;
var
i,v: integer;
begin
SetLength(infothread,self.Memo1.Lines.Count); // 动态设置线程的数量
for i := 0 to self.Memo1.Lines.Count -1 do
begin
infothread[i] := getinfo.Create(self.Memo1.Lines.Strings[i],self.treeview1);
infothread[i].OnTerminate := Threadok;
end;
end;
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ComCtrls,getinfo;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
TreeView1: TTreeView;
Button2: TButton;
procedure Threadstop(sender:TObject);
procedure GetStart;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
infothread:array of Tgetinfo;
implementation{$R *.dfm}procedure Tform1.Threadstop(sender:TObject);
begin
memo1.Lines.Add('一个线程结束');
end;procedure Tform1.GetStart;
var
i,v: integer;
begin
SetLength(infothread,self.Memo1.Lines.Count); // 动态设置线程的数量
for i := 0 to self.Memo1.Lines.Count -1 do
begin
infothread[i] := Tgetinfo.Create(self.Memo1.Lines.Strings[i],treeview1);
infothread[i].OnTerminate := ThreadStop;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin //线程创建按钮
Getstart;
end;procedure TForm1.Button2Click(Sender: TObject);
begin //线程终止按钮,当然这儿终止的是第一个线程
infothread[0].Terminate;//立即终止线程,当然这儿线程运行很快,看不到效果
end;end.
Classes,ComCtrls;type
TGetInfo = class(TThread)
private
{ Private declarations }
v,a:string;
ViewList:TTreeView;
procedure Check;
protected
procedure Execute; override;
public
constructor Create(h:string;vlist:TTreeview);
destructor Destroy;override;
end;implementationuses unit1;
procedure TGetInfo.Check;
begin
form1.memo1.lines.add(a);
end;constructor TGetInfo.Create(h:string;vlist:TTreeview);
begin
inherited create(true);v:=h;
ViewList:=vlist;FreeOnTerminate:=True;
Suspended := false;
end;destructor TGetInfo.Destroy;
begin inherited;
end;procedure TGetInfo.Execute;
begin
a:=v;
Synchronize(check);
end;end.
unit GetInfo;interfaceuses
Classes,ComCtrls;type
TGetInfo = class(TThread)
private
{ Private declarations }
v,a:string;
ViewList:TTreeView;
procedure Check;
protected
procedure Execute; override;
public
constructor Create(h:string;vlist:TTreeview);
destructor Destroy;override;
end;implementationuses unit1;
procedure TGetInfo.Check;
begin
form1.memo1.lines.add(a);
end;constructor TGetInfo.Create(h:string;vlist:TTreeview);
begin
inherited create(true);v:=h;
ViewList:=vlist;FreeOnTerminate:=True;
Suspended := false;
end;destructor TGetInfo.Destroy;
begin
//
inherited;
end;procedure TGetInfo.Execute;
var
i:integer;
begin
a:=v;
for i:=0 to 1000 do
begin
Synchronize(check);//这儿给你举了个,运行期间让线程终止的方法
if self.Terminated then break;
end;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ComCtrls,getinfo;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
TreeView1: TTreeView;
Button2: TButton;
procedure Threadstop(sender:TObject);
procedure GetStart;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
infothread:array of Tgetinfo;
implementation{$R *.dfm}procedure Tform1.Threadstop(sender:TObject);
begin
memo1.Lines.Add('一个线程结束');
end;procedure Tform1.GetStart;
var
i,v: integer;
begin
SetLength(infothread,self.Memo1.Lines.Count); // 动态设置线程的数量
for i := 0 to self.Memo1.Lines.Count -1 do
begin
infothread[i] := Tgetinfo.Create(self.Memo1.Lines.Strings[i],treeview1);
infothread[i].OnTerminate := ThreadStop;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin //线程创建按钮
Getstart;
end;procedure TForm1.Button2Click(Sender: TObject);
begin //线程终止按钮,当然这儿终止的是第一个线程
infothread[0].Terminate;//立即终止线程,当然这儿线程运行很快,看不到效果
end;end.
这样在主线程里面调用terminate方法就可以让线程终止了。还有就是要注意同步,你在线程里使用了主界面的控件,需要同步。
......function check:string;
begin
form1.memo1.lines.add(v);//为了后面的同步调用简单,这里直接使用线程类的变量而不再用参数了
end;procedure getinfo.Execute;
begin
if not Terminated then break; //
Synchronize(Check); //同步
end;
主线程调用的时候就:infothread[i].Terminate ;
比如 Synchronize(check(info)); ? 那样估计会好.
发表于:2008-07-02 02:08:02时间过去多长时间了Synchronize(Check); //只能这样调用 Synchronize(check(info)); //不能这样