读书人

有没有可能一个线程的Execute运行结束

发布时间: 2012-05-10 16:02:39 作者: rapoo

有没有可能一个线程的Execute运行结束,但线程未真正结束?
var
th:a:

procedure a.Execute ;
begin
try
FreeOnTerminate := true;
.....
finally
th.Terminate;
end;
end;

有没有可能程序运行到了th.Terminate,但是线程没有真正结束?



[解决办法]
Classes单元的ThreadProc才是真正在线程中跑的全部代码,Execute只不过是其中的一部分!!!

function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
{$IFDEF LINUX}
if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
{$ENDIF}
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
finally
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.DoTerminate;
Thread.FFinished := True;
SignalSyncEvent;
if FreeThread then FreeAndNil(Thread);
{$IFDEF MSWINDOWS}
EndThread(Result);
{$ENDIF}
{$IFDEF LINUX}
// Directly call pthread_exit since EndThread will detach the thread causing
// the pthread_join in TThread.WaitFor to fail. Also, make sure the EndThreadProc
// is called just like EndThread would do. EndThreadProc should not return
// and call pthread_exit itself.
if Assigned(EndThreadProc) then
EndThreadProc(Result);
pthread_exit(Pointer(Result));
{$ENDIF}
end;
end;

读书人网 >.NET

热点推荐