来源:https://www.cnblogs.com/azhqiang/p/3955490.html
//判断线程是否释放
//返回值:0-已释放;1-正在运行;2-已终止但未释放;//3-未建立或不存在
function CheckThreadFreed(aThread: TThread): Byte;
var
i: DWord;
IsQuit: Boolean;
begin
if Assigned(aThread) then
begin
IsQuit := GetExitCodeThread(aThread.Handle, i);
if IsQuit then //If the function succeeds, the return value is nonzero.
//If the function fails, the return value is zero.
begin
if i = STILL_ACTIVE then //If the specified thread has not terminated,
//the termination status returned is STILL_ACTIVE.
Result := 1
else
Result := 2; //aThread未Free,因为Tthread.Destroy中有执行语句
end
else
Result := 0; //可以用GetLastError取得错误代码
end
else
Result := 3;
end;
来源:https://zhidao.baidu.com/question/486040041.html
判断线程是否存在使用:
if Assigned(workthread) then
begin
//do work
end;
释放线程使用:
可以使线程对象自动释放,使用:workthread.FreeOnTerminate :=True;
如果想自己释放线程则应该先判断线程是否存在和是否结束然后再释放,使用:
if Assigned(workthread) and (not workthread.Finished) then
begin
//workthread.terminate; //停止线程
//workthread.suspended; //使线程暂停
以上两种都可以,如果使用Terminate则应该等待线程完全结束
workthread.Free; //释放线程
end;