我写了一个多线程程序,
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函数想销毁线程,就进入了死循环,程序就卡主了,请问是什么原因,怎么解决?
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函数想销毁线程,就进入了死循环,程序就卡主了,请问是什么原因,怎么解决?
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;
if ReceiveMsgThread.Suspended then
ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
if ReceiveMsgThread.Suspended then
ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
是不是线程被Suspended了,就不能销毁啊?
if ReceiveMsgThread.Suspended then
ReceiveMsgThread.Resume;怕线程被Suspended了,所以要Resume起来
是不是线程被Suspended了,就不能销毁啊?被suspended了,你程式就会结束不了,卡在那里
不过你现在问题应该不在这,可能像楼上说的ReadLn上
TcpClient最好不要放在线程中,也不需要放在线程中。
另外你说
“TcpClient最好不要放在线程中,也不需要放在线程中。”
那对于delphi 7的TIdTCPClient,该如何接收来自服务器发过来的数据?
有什么好的方法吗?
用线程通讯肯定没错,FreeOnTerminate := true
释放时,直接将实例 Terminate,客户端手动断开与服务端的连接