关于线程的停止和启动问题

lostapple 2004-07-27 05:47:28
线程中有连接远程数据库。如果执行中间网络有问题的话线程就停在那儿了,即使停止线程再启动还是没反映。需要整个程序退出再运行才行。

停止及启动线程程序如下:

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;
...全文
251 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lostapple 2004-08-01
  • 打赏
  • 举报
回复
顶一下。没人能解么?
bluesky23 2004-07-29
  • 打赏
  • 举报
回复
UP
tttk 2004-07-29
  • 打赏
  • 举报
回复
Terminate只是发出Terminated=True信号,并不会实际终止线程。如果线程中出现死锁,waitfor将永远不会返回,这样free语句根本不起作用。

多线程内部有相当复杂的运行机制,对于线程的退出,我也在寻找好的解决办法。
现在我只有使用TerminateThread来终止——头痛。
lostapple 2004-07-29
  • 打赏
  • 举报
回复
To:IFindit(寻找其中的乐趣) :
  trans.Terminate;这句会置trans.Terminate为true的。
唉,楼上几位难道还实没看明白我的表达么(寒,是我口齿不清么?),
在线程里的程序没遇到错误(比如网络中断导致连接数据库或者执行查询失败)时,我的程序是完全可以正常工作的。我要问的是在出错时为什么不能再正常起动线程。

IFindit 2004-07-29
  • 打赏
  • 举报
回复
你下面的程序执行到,waitfor就停住了.
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;

setfocus 2004-07-29
  • 打赏
  • 举报
回复
application.ProcessMessages ;搞定它!
lostapple 2004-07-29
  • 打赏
  • 举报
回复
再强调,我现在求解的是线程内程序出现异常导致的线程死掉而无法FREE和重新启动的解决办法。正常情况下我的线程是完全可以正常的停止和启动的!
或者从另一方面求解,线程内的程序应该如何建立强壮的错误检测机制以拦截所有可能发生的错误,并以此自动结束线程。
我的线程程序:
procedure transthread.Execute;
begin
setlog('传输服务已启动:'+datetimetostr(now));
while not Terminated do
begin
数据传输程序...
end;
setlog('传输服务已终止:'+datetimetostr(now));
end;
GoldShield 2004-07-28
  • 打赏
  • 举报
回复
学习一下
IFindit 2004-07-28
  • 打赏
  • 举报
回复
把线程中Create那 代码贴出来, 里在应该有连接数据库的操作,线程结束后,那里面的资源没有释放, 也就是说在线程开始时,一定要再连接一 遍数据库!
lostapple 2004-07-28
  • 打赏
  • 举报
回复
楼上都未解决问题。
实际情况是,在网络正常(也就是线程里的程序都可正常运行下去)时,用我以上两个程序都是可以正常启动和停止线程的。问题在于,一旦线程非正常中断(就是在执行时中断了,但没有出错信息),死在那儿了,那么再运行停止和启动程序,不能正常启动线程,除非把程序关了,再运行,就又正常了。是不是说, trans.Terminate; trans.WaitFor;trans.Free;这三句不能完全释放线程?(即使用freeandnil(trans))
linzhengqun 2004-07-27
  • 打赏
  • 举报
回复
procedure Tmain.Button1Click(Sender: TObject);
begin
trans := transthread.Create(False);

trans.Terminated:=True; //增加此句试试

label1.Caption:='服务运行中';
button1.Enabled:=false;
button2.Enabled:=true;
end;
aiirii 2004-07-27
  • 打赏
  • 举报
回复
>> trans.Free;
改為
FreeAndNil( trans);

不過, 還要看其它代碼的設置
FOX7899 2004-07-27
  • 打赏
  • 举报
回复
可能有些东西要重新初始化的

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧