这么做线程能安全释放吗?如下代码有问题吗? ( 积分: 100 )

  • 主题发起人 主题发起人 bbcock
  • 开始时间 开始时间
B

bbcock

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码创建和释放线程有问题吗?中途关闭程序,线程能安全释放吗?在线程中让主线程的label控件显示信息,需要线程同步吗?
主线程
procedure TForm1.FormShow(Sender: TObject);
begin
thread1:=jieshou.Create ;
thread1.FreeOnTerminate := True;
thread1.resume;
end;

jieshou线程
constructor jieshou.create;
begin
inherited create(TRUE);
end;

procedure jieshou.Execute;
var
j:integer;
begin
if not Terminated then
begin
Hd := FindWindow (nil,'jieshouchengxu');
for j:=0 to 3000do
begin
if terminate then
break;

数据操作代码......
form1.label1.Caption :='正常';
end;
sendMessage(hd,wm_close,0,0);
end;
end;
 
以下代码创建和释放线程有问题吗?中途关闭程序,线程能安全释放吗?在线程中让主线程的label控件显示信息,需要线程同步吗?
主线程
procedure TForm1.FormShow(Sender: TObject);
begin
thread1:=jieshou.Create ;
thread1.FreeOnTerminate := True;
thread1.resume;
end;

jieshou线程
constructor jieshou.create;
begin
inherited create(TRUE);
end;

procedure jieshou.Execute;
var
j:integer;
begin
if not Terminated then
begin
Hd := FindWindow (nil,'jieshouchengxu');
for j:=0 to 3000do
begin
if terminate then
break;

数据操作代码......
form1.label1.Caption :='正常';
end;
sendMessage(hd,wm_close,0,0);
end;
end;
 
我是这样做的:
procedure TMainfrm.FormCreate(Sender: TObject);
begin
m_clUpdateThread := TUpdateThread.Create
(
m_clProcStepTask,
OnUpdateMsg
);
m_clUpdateThread.OnTerminate := OnUpdateTaskThreadDone;
end;

procedure TMainfrm.OnUpdateTaskThreadDone(Sender: TObject);
begin
{线程结束了}
end;

procedure TMainfrm.FormDestroy(Sender: TObject);
begin
FreeAndNil(m_clUpdateThread);
end;

 
搂主,线程应该是Repeat.....Until格式的
 
关闭程序的时候
thread1.Terminated;
thread1.waitfor;
另外,form1.label1.Caption :='正常';这行代吗要同步
 
进程都退出了,能释放掉的。
 
搂主,线程应该是Repeat.....Until格式的
第一次听说,不可能吧
 
to:yanshi1980,
能解释一下:线程应该是Repeat.....Until格式的
的原因吗?我总是用while语句的。
 
不能安区释放,可能会有错误发生。解决的办法是加入一个内核对象,然后waitforsingleobject(), 这样才可能。我建议最好手工来释放线程
 
to gongyuzhuo:
能说说为什么不能安全释放,会产生什么错误吗?
 
多人接受答案了。
 
后退
顶部