procedure TmyThread.Execute;
begin
// inherited execute;
// freeonterminate:=true;
while true do
begin
messagebeep(mb_iconhand);//发出声音
sleep(1000);
IF 你想结束 THEN
BREAK;
end;
end;
end.
begin
// inherited execute;
// freeonterminate:=true;
while true do
begin
messagebeep(mb_iconhand);//发出声音
sleep(1000);
IF 你想结束 THEN
BREAK;
end;
end;
end.
跟一下TThread的源码后发现Terminate函数和Suspend,Resume函数的处理是不同的,Suspend和Resume里都调用了API函数操作线程,而Terminate 里没有!!!
大概它认为API的TerminateThread函数无法将线程里所有的资源全部释放,
容易导致内存上的问题,所以把停止线程的工作交给线程本身来处理,
TThread的Termiante属性其实是让它在Execute 里来判断的:
procedure TmyThread.Execute ;
begin
while true do
begin
//你想做的事情
...
if terminated then
break ;
end ;
end ;//附上TThread的几个方法,可以看出差别
procedure TThread.Suspend;
begin
FSuspended := True;
SuspendThread(FHandle);
end;
procedure TThread.Resume;
begin
if ResumeThread(FHandle) = 1 then FSuspended := False;
end;procedure TThread.Terminate;
begin
FTerminated := True;
end;
begin
inherited Create(Suspended); resume; //---------------------加一句end;
destructor tmythread.destroy ;
begin
// suspended:=true;
// freeonterminate:=true;
inherited destroy;
end;
procedure TmyThread.Execute;
begin
// inherited execute;
// freeonterminate:=true;
while true do
begin
messagebeep(mb_iconhand);//发出声音
sleep(1000); break;//-------------------结束; end;
end;
begin
while not Terminate do
begin
MessageBeep(MB_ICONHAND); //发出声音
Sleep(1000);
end;
end;
// 说明:控制线程何时结束应该是线程本身的工作,这样线程有机会在结束时做一些清理工作。
//