线程中有连接远程数据库。如果执行中间网络有问题的话线程就停在那儿了,即使停止线程再启动还是没反映。需要整个程序退出再运行才行。停止及启动线程程序如下:procedure Tmain.Button1Click(Sender: TObject);
begin
trans := transthread.Create(False);
label1.Caption:='服务运行中';
button1.Enabled:=false;
button2.Enabled:=true;
end;procedure Tmain.Button2Click(Sender: TObject);
begin
trans.Terminate;
trans.WaitFor;
trans.Free;
label1.Caption:='服务已终止';
button1.Enabled:=true;
button2.Enabled:=false;
end;
begin
trans := transthread.Create(False);
label1.Caption:='服务运行中';
button1.Enabled:=false;
button2.Enabled:=true;
end;procedure Tmain.Button2Click(Sender: TObject);
begin
trans.Terminate;
trans.WaitFor;
trans.Free;
label1.Caption:='服务已终止';
button1.Enabled:=true;
button2.Enabled:=false;
end;
改為
FreeAndNil( trans);不過, 還要看其它代碼的設置
begin
trans := transthread.Create(False); trans.Terminated:=True; //增加此句试试 label1.Caption:='服务运行中';
button1.Enabled:=false;
button2.Enabled:=true;
end;
实际情况是,在网络正常(也就是线程里的程序都可正常运行下去)时,用我以上两个程序都是可以正常启动和停止线程的。问题在于,一旦线程非正常中断(就是在执行时中断了,但没有出错信息),死在那儿了,那么再运行停止和启动程序,不能正常启动线程,除非把程序关了,再运行,就又正常了。是不是说, trans.Terminate; trans.WaitFor;trans.Free;这三句不能完全释放线程?(即使用freeandnil(trans))
现在我只有使用TerminateThread来终止——头痛。
或者从另一方面求解,线程内的程序应该如何建立强壮的错误检测机制以拦截所有可能发生的错误,并以此自动结束线程。
我的线程程序:
procedure transthread.Execute;
begin
setlog('传输服务已启动:'+datetimetostr(now));
while not Terminated do
begin
数据传输程序...
end;
setlog('传输服务已终止:'+datetimetostr(now));
end;
procedure Tmain.Button2Click(Sender: TObject);
begin
trans.Terminate;
trans.WaitFor;
trans.Free;
label1.Caption:='服务已终止';
button1.Enabled:=true;
button2.Enabled:=false;
end;应改为:
你下面的程序执行到,waitfor就停住了.
procedure Tmain.Button2Click(Sender: TObject);
begin
trans.Terminate := true;
trans.WaitFor;
trans.Free;
label1.Caption:='服务已终止';
button1.Enabled:=true;
button2.Enabled:=false;
end;
trans.Terminate;这句会置trans.Terminate为true的。
唉,楼上几位难道还实没看明白我的表达么(寒,是我口齿不清么?),
在线程里的程序没遇到错误(比如网络中断导致连接数据库或者执行查询失败)时,我的程序是完全可以正常工作的。我要问的是在出错时为什么不能再正常起动线程。