constructor TConvertThread.Create(iGroupId: integer; sGroupName: string);
begin
inherited Create(True);
FreeOnTerminate := True;
iCvtGroupId := iGroupId;
sCvtGroupName := sGroupName;
end;
destructor TConvertThread.Destroy;
begin
Self.sMsg := '转换线程' + '[' + sCvtGroupName + ']' + '停止!';
Self.sShowMsg := Self.sMsg;
inherited Destroy;
end;
-------------主线程调用线程代码--------
ConvtThread := TConvertThread.Create(0,'0');
ConvtThread.Resume;
-------------主线程释放代码------------
ConvtThread.Terminate;
ConvtThread.WaitFor;
--------------------------------
释放时报
System Error.Code: 6.句柄无效
其中如果用delphi5编译不报错,用delphi6编译执行就报这个错,去掉inherited Destroy;就不报错了,但是我不知道原因是什么?
begin
inherited Create(True);
FreeOnTerminate := True;
iCvtGroupId := iGroupId;
sCvtGroupName := sGroupName;
end;
destructor TConvertThread.Destroy;
begin
Self.sMsg := '转换线程' + '[' + sCvtGroupName + ']' + '停止!';
Self.sShowMsg := Self.sMsg;
inherited Destroy;
end;
-------------主线程调用线程代码--------
ConvtThread := TConvertThread.Create(0,'0');
ConvtThread.Resume;
-------------主线程释放代码------------
ConvtThread.Terminate;
ConvtThread.WaitFor;
--------------------------------
释放时报
System Error.Code: 6.句柄无效
其中如果用delphi5编译不报错,用delphi6编译执行就报这个错,去掉inherited Destroy;就不报错了,但是我不知道原因是什么?
解决方案 »
- sql客户端为什么不能备份数据?
- 请问 ServerSocket 的 servertype 的stNonBlocking 和 stThreadBlocking 有什么区别??????
- 程序退出后,TOleContainer为什么不能自动关闭进程的winword.exe????
- 哪里有股票软件的流程图啊????????100分!!!!!!不够也没有办法了!!!!!!!!
- 如何在DBgrid中实现字段数据的下拉提示效果?
- 哪位大侠做过电子档案软件?
- 帮忙呀!动态创建ADOConnection的问题!(在线等)
- 如何调试dll?
- 请教:初次使用spcomm控件,在接受事件中传递的是一个指针,如何从指针得到字符串?
- sos:关于自定义报表的问题(不好意思,这是我的最高分啦!!!!!)
- 各路牛哥帮忙
- 使用SPCOMM控件问题
ConvtThread.Terminate;
ConvtThread.WaitFor;
--------------------------------你自己又释放了一次,肯定要出错嘛
TConvertThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create(iGroupId: integer; sGroupName: string);
destructor Destroy override;
end;
----------------------------------
FreeOnTerminate := True; 表示线程结束后会自动释放,虽然说是自动释放,但是如果我的类里自行分配了内存,那也得调用destory过程进行释放吧!
FreeOnTerminate:= true后,一旦程序发出 ConvtThread.Terminate;系统会自动去调用destory进行释放,这时候再去调用ConvtThread.waitfor,因为对象ConvtThread不存在了,而waitfor会调用windows api去取句柄,从而导致产生句柄无效的错误,所以正确的方法是 FreeOnTerminate置为false,然后用下列代码进行线程的释放
ConvtThread.Terminate;
ConvtThread.WaitFor;
ConvtThread.free;
或者
FreeOnTerminate := true;
ConvtThread.Terminate;
try
ConvtThread.WaitFor;
except
end;
谢谢各位了.