在线程中的循环语句程执行前创建窗体,在循环过程结束后关闭该窗体,在退出主程序时,报错“无效的窗口句柄”? 请高手指点 (50分)

  • 主题发起人 主题发起人 chief_marshal
  • 开始时间 开始时间
C

chief_marshal

Unregistered / Unconfirmed
GUEST, unregistred user!
我的工程中有一A窗体,该窗体调用了一线程。线程中有一段循环语句。在循环语句程执行前,我创建了一个B窗体,B窗体上有一进程条,随着线程中循环语句的执行不断变化。在循环过程结束后,关闭B窗体。
问题是:当我退出A窗体时,无任何错误。但退出工程时,报错“无效的窗口句柄”。不知是什麽原因?
1、我跟踪过程序,在退出工程时,在工程的 close 中,有语句rmDomain.FreeAllObject;
在此语句之前都不报错。
2、如果进程中不创建B窗体,不会报错.
我的线程代码如下:
procedure Tcal_serdata.Execute;
var
... ...
begin
//创建状态提示窗体,Form_state为上文提到的B窗体
Form_state:=TForm_state.Create(Application);
Form_state.Show;
Form_state.ProgressBar.Max:=F_serana.subtime;
Form_state.ProgressBar.Position:=0;

for i_count:=1 to F_serana.subtimedo
begin
//状态条变化
Form_state.ProgressBar.Position:=i_count;
... ...
end;
//end for
//数据处理完毕,关闭状态提示窗体
Form_state.close;
... ...
end;
问题出在那里?请各位高手指点!
 
Form_state.close;
执行后,窗体不一定释放,你干脆用 .free释放试试
 
Form_state:=TForm_state.Create(self);
Form_state.close;
form_state.free;
将form_state窗口由主程序释放改为手动释放看看。
 
杀死线程!
 
在DELPHI的联机帮助中,推荐使用的释放窗体的过程为 Release;
我试过了,问题依旧!
换成
Form_state.close;
form_state.free;
仍然报“无效的窗口句柄”错!
 
用Synchronize方法执行窗体的创建,在OnTerminate事件中释放窗体。
 
thx1180:
谢谢你的指点,用Synchronize方法执行窗体的创建,果然解决了问题。但OnTerminate事件中释放窗体是如何进行的?
我的代码如下:
procedure MyThread.OnTerminate;
begin
Form_state.Release;
end;
可是我跟踪程序,这段代码执行不到,Form_state窗体仍然显示,但退出时不报错。
请再指点!
 
不用啦 你不释放B窗体都不会保错的 不用在线程和其他地方释放B窗体啦
试试吧
 
procedure TForm1.DoOnThreadTerminate(Sender: TObject);
begin
Form_state.Free;
end;

在创建线程时:
MyThread := Tcal_serdata.Create(True);
MyThread.OnTerminate :=do
OnThreadTerminate;
MyThread.Resume;
//恢复执行;
 
按照thx1180 朋友的方法,问题解决了!谢谢大家的关心和指点!
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
875
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部