indy和线程一起用时总是出现错误,麻烦帮忙看看。 (50分)

  • 主题发起人 主题发起人 talent002
  • 开始时间 开始时间
T

talent002

Unregistered / Unconfirmed
GUEST, unregistred user!
我用idtcpserver和idtcpclient做C/S的通讯程序。总是出现问题。
退出时总是有个错误的对话框出来。
想问一下这样的代码会不会调用MyThread.Terminate里程序无法结束?
procedure MyThread.execute;
var
data:pointer;
begin
inherited;
getmem(data,1000);
while not self.Terminated do
begin
self.tcpclient.ReadBuffer(data^,1000);《〈程序运行到这里如果服务器端没有数据发来,会不会无限期等下去?导致调用MyThread.Terminate也不能把线程终止?
....
....
end;
freemem(data);
end;


2、我在退出程序时要不要再连接在onclose里终止线程?
 
1. 符合以下两个条件时会无限期等下去:
A.ReadTimeOut=0;
B.连接没有被中断;
2. 最好这样做
 
1、我的readtimeout的确是0。但是我退出了程序线程也会无限期等下去吗?不是主进程退出了副线程也退出的吗?可是实际上是,我有时退出程序以后就不能再连接上了。

2、我在onclose里
mythread.Terminate;
mythread.suspend; 《〈在这里出错。我估计应该跟那个tcpclient.ReadBuffer有关,不知道是不是这个原因?
mythread.free;



 
如果线程的 FreeOnTerminate:=真,哪么在线程结束时线程实例已经free了。你再mythread.suspend是不行的,mythread.free是不需要的。
如果FreeOnTerminate:=false 哪么需要mythread.Terminate后mythread.WaitFor和mythread.free:
 
但是我这个程序好像不能把程序terminate。因为他在读数据的时候,因为服务器端没有数据发送过来而导致一直在等待。(这是我的想法,不知是不是这个原因)。
 
我觉得也是这个问题,以前我也做了一个这样的程序,也出现同样的问题。在监视执行情况时,发现客户端线程在等待服务器的数据发送.但具体如何terminate,没有研究.
 
如果我用一个变量(数据保存连接的信息),在idtcpserver的onexecute里有一个readbuffer(a,1000);如果这样客户端没有数据发送过来。然后就断来了。我的这个线程会自动怎么样?
 
如果线程一直在等待.Terminate是不能真正停止线程执行的.
 
那怎么办?即然readbuffer没有把数据接收完线程就一直在等待,那有没办法让readbuffer立即结束?
 
你在终止你的线程就要先把Indy的连接关闭掉,也就是让Read函数返回。
 
我现在就是不知道怎么样在终止线程前让read返回。
另外,我是在TidTCPserver 的onDisconnect 事件中终于线程的。按道理connect已经断来的了,为什么还会这样呢?哎!!搞不懂,先看看哪位能告诉我怎么让readbuffer终止啊。

谢谢
 

Similar threads

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