procedure TFrm_Main.FormDestroy(Sender: TObject);
begin
WideLookThread.Terminate;
WideLookThread.Free;
WideLookThread := nil;
end;程序退出后,Delphi的调试窗体还是在Running状态,这是为什么???
谢谢了
begin
WideLookThread.Terminate;
WideLookThread.Free;
WideLookThread := nil;
end;程序退出后,Delphi的调试窗体还是在Running状态,这是为什么???
谢谢了
好像释放先得用Destroy方法吧。 WideLookThread.Terminate;
WideLookThread.Destroy;
WideLookThread.Free;
WideLookThread := nil;你在试试。
begin
WideLookThread.Terminate;
WideLookThread.WaitFor; // 看看你的线程能不能结束
WideLookThread.Free;
end;
还是不结束呀
procedure TWideLook.Execute;
begin
FreeOnTerminate := true;
if LookInBelt then
Application.MessageBox('该问题有解!', '提示', MB_ICONINFORMATION)
else
Application.MessageBox('很遗憾,该问题没有结果!', '提示', MB_ICONINFORMATION);
end;
这是我的线程
begin
WideLookThread.Terminate;
WideLookThread.WaitFor;
WideLookThread.Destory;
end;
这样试试呢
OnExecute中必须检查Terminated属性,只有OnExecute方法结束了,才会Terminate的所以必须
while not Terminated do ...
才能保证Terminate方法的有效
如果只用 menu.terminate; 退出过后不会报错
但是只要加上 menu.waitfor; 就会报错
报错内容如下:
exceplion class EOSError with message'System Error. Code:6. 句柄无效
是不是一个检测同步信号的过程?那么可能是 LookInBelt 无法返回。
把 LookInBelt 帖出来看看。
是不是没触发这个事件?(俺是菜鸟别笑俺)
property IsEnd:boolean read FIsEnd write FIsEnd;
在线程的主循环中判断是否需要退出
while true do
begin
if FIsEnd then
break;
...
end;在结束线程时
WideLookThread.IsEnd := true
WideLookThread.WaitFor;
WideLookThread.Free;
WideLookThread := nil;
你说得while not Terminated do
在什么地方加?
我试试gxd0001得方法是否有效
var
p: PDataRec;
begin
Result := false;
p := H_Data;
while p <> nil do
begin
if p^.sign = 1 then
begin
p^.sign := 0;
if WideLook(p^.Data) then
begin
Result := true;
exit;
end;
end;
p := p^.Next;
end;
end;
//这个函数就是查询链表里面得值,没有特殊得意思
function LookInBelt: boolean;//循环的读取链表查询每个可能的值 true:找到了 false: 没有找到;
var
p: PDataRec;
begin
Result := false;
p := H_Data;
while p <> nil do
begin
if WideLookThread.IsEnd then //这里加了一个判断
begin
Result := false;
break;
end;
if p^.sign = 1 then
begin
p^.sign := 0;
if WideLook(p^.Data) then
begin
Result := true;
exit;
end;
end;
p := p^.Next;
end;
end;可是在窗体结束时,却提示线程句柄无效,这是什么错误
procedure TFrm_Main.FormDestroy(Sender: TObject);
begin
if WideLookThread = nil then
exit;
WideLookThread.IsEnd := true;
WideLookThread.Terminate;
WideLookThread.Destroy;
//WideLookThread.WaitFor;
WideLookThread.Free;
WideLookThread := nil;
end;
所以下面两句不再需要。另外,下面两行只能任选其一,不可都执行。
WideLookThread.Destroy;
WideLookThread.Free;