多线程程序调用Free就会进入死循环?

tjs_125 2013-08-08 12:07:13
我写了一个多线程程序,
TReceiveMsgThread = class(TThread)

这个类的Execute里面就是不断调用TcpClient的ReadLn函数。
procedure TReceiveMsgThread.Execute;
begin
try
while (not Terminated) and (FTcpClient.Connected) do
begin
try
revData := FTcpClient.ReadLn(FMsgEndStr); // FMsgEndStr表示信息结尾符
revData := revData + FMsgEndStr; // 读取的tcp数据不含结尾
Synchronize(HandleRevData);
except
if FTCPClient.Connected then FTCPClient.Disconnect;
Terminate;
end;
end; // while
except
end;
end;

线程的FreeOnTerminate := false; 现只要我显式调用线程的Free函数想销毁线程,就进入了死循环,程序就卡主了,请问是什么原因,怎么解决?
...全文
208 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdejtod 2013-08-08
  • 打赏
  • 举报
回复
楼主可以参考一下IndyDemos\IdTCPDemo的例子,客户端都是创建一个线程与服务端通讯的
mdejtod 2013-08-08
  • 打赏
  • 举报
回复
那对于delphi 7的TIdTCPClient,该如何接收来自服务器发过来的数据? 用线程通讯肯定没错,FreeOnTerminate := true 释放时,直接将实例 Terminate,客户端手动断开与服务端的连接
tjs_125 2013-08-08
  • 打赏
  • 举报
回复
按你说的, 不要 ReceiveMsgThread.WaitFor;这一句,好像问题已经解决了。 另外你说 “TcpClient最好不要放在线程中,也不需要放在线程中。” 那对于delphi 7的TIdTCPClient,该如何接收来自服务器发过来的数据? 有什么好的方法吗?
feiba7288 2013-08-08
  • 打赏
  • 举报
回复
引用 6 楼 tjs_125 的回复:
[quote=引用 5 楼 feiba7288 的回复:] [quote=引用 4 楼 tjs_125 的回复:] [quote=引用 1 楼 feiba7288 的回复:] var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;
想请教一下,结束线程时为什么要启动线程呢? if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume;[/quote] 怕线程被Suspended了,所以要Resume起来[/quote] 是不是线程被Suspended了,就不能销毁啊?[/quote] 被suspended了,你程式就会结束不了,卡在那里 不过你现在问题应该不在这,可能像楼上说的ReadLn上 TcpClient最好不要放在线程中,也不需要放在线程中。
tjs_125 2013-08-08
  • 打赏
  • 举报
回复
引用 5 楼 feiba7288 的回复:
[quote=引用 4 楼 tjs_125 的回复:] [quote=引用 1 楼 feiba7288 的回复:] var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;
想请教一下,结束线程时为什么要启动线程呢? if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume;[/quote] 怕线程被Suspended了,所以要Resume起来[/quote] 是不是线程被Suspended了,就不能销毁啊?
feiba7288 2013-08-08
  • 打赏
  • 举报
回复
引用 4 楼 tjs_125 的回复:
[quote=引用 1 楼 feiba7288 的回复:] var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;
想请教一下,结束线程时为什么要启动线程呢? if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume;[/quote] 怕线程被Suspended了,所以要Resume起来
tjs_125 2013-08-08
  • 打赏
  • 举报
回复
引用 1 楼 feiba7288 的回复:
var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;
想请教一下,结束线程时为什么要启动线程呢? if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume;
tjs_125 2013-08-08
  • 打赏
  • 举报
回复
引用 1 楼 feiba7288 的回复:
var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;
试了2楼的代码,还是不行
s11ss 2013-08-08
  • 打赏
  • 举报
回复
估计是卡在ReadLn了
feiba7288 2013-08-08
  • 打赏
  • 举报
回复
var ReceiveMsgThread: TReceiveMsgThread; if Assigned(ReceiveMsgThread) then begin ReceiveMsgThread.Terminate; if ReceiveMsgThread.Suspended then ReceiveMsgThread.Resume; ReceiveMsgThread.WaitFor; ReceiveMsgThread.Free; end;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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