一般情况下,利用将FreeOnTerminate的属性设为True的方法来及时清除线程对象是最方便的办法,这只需要在Excute()退出前设置就行了。 设置方法如下: Procedure TTestThread.execute; Var i : integer; Begin Inherited; FreeOnTerminate:=true; For i := 1 To 10000000 Do Begin if Terminated then break; inc(count); Synchronize(getcount); End; End;
至于第二个问题,你看看这个,我只是简单的加一,你可以自己改Unit Unit1;InterfaceUses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;Type TForm1 = Class(TForm) Edit1: TEdit; Button1: TButton; ListBox1: TListBox; Procedure Button1Click(Sender: TObject); Procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } threadlist: Tlist; End; TTestThread = Class(TThread) private public Procedure getcount; Procedure execute; override; End; Var Form1 : TForm1; count : integer; Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute; Var i : integer; Begin Inherited; FreeOnTerminate := true; For i := 1 To 10000 Do Begin If Terminated Then break; inc(count); End; End;Procedure TTestThread.getcount; Begin End;Procedure TForm1.Button1Click(Sender: TObject); Var i : integer; Begin Try For i := 1 To 100 Do Begin threadlist.Add(TtestThread.Create(false)); sleep(100); ListBox1.Items.Add(inttostr(count)); End Except showmessage('erro'); End End;Procedure TForm1.FormCreate(Sender: TObject); Begin threadlist := TList.Create; End;End.
---------------------------------------
这是不可能,没有"立刻"这种事情,Windows 都不是实时操作系统.
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);结束别的
例如,当线程代码陷入死循环时。TerminateThread()的声明如下:
function TerminateThread(hThread:THandle;dwExitCode:DWORD);TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:
TerminateThread(MyHosedThread.Handle,0)
如果选择使用这个函数,应该考虑到它的负面影响。
首先,此函数在Windows NT与在Windows 95/98下并不相同。在Windows 95/98 下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍然保留。
其次,无论线程代码中是否有try...finally块,
这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的
内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知D L L,当D L L关闭时,这也容易出现问题
设置方法如下:
Procedure TTestThread.execute;
Var
i : integer;
Begin
Inherited;
FreeOnTerminate:=true;
For i := 1 To 10000000 Do
Begin
if Terminated then break;
inc(count);
Synchronize(getcount);
End;
End;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;Type
TForm1 = Class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Procedure Button1Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
threadlist: Tlist;
End;
TTestThread = Class(TThread)
private public
Procedure getcount;
Procedure execute; override; End;
Var
Form1 : TForm1;
count : integer;
Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute;
Var
i : integer;
Begin
Inherited;
FreeOnTerminate := true;
For i := 1 To 10000 Do
Begin
If Terminated Then
break;
inc(count);
End;
End;Procedure TTestThread.getcount;
Begin
End;Procedure TForm1.Button1Click(Sender: TObject);
Var
i : integer;
Begin
Try
For i := 1 To 100 Do
Begin
threadlist.Add(TtestThread.Create(false));
sleep(100);
ListBox1.Items.Add(inttostr(count));
End
Except
showmessage('erro');
End
End;Procedure TForm1.FormCreate(Sender: TObject);
Begin
threadlist := TList.Create;
End;End.