IdTCPClient1问题

wg168 2004-04-21 03:11:42
程序如下:
procedure TClientHandleThread.Execute;
var
UserInfo: TUserInfo;
begin
while not Terminated do begin
if not frmAppServer.IdTCPClient1.Connected then
Terminate
else
try
frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
//////////////////////////////////////////////////////////////////////////////
//执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
所以 sResult='' 请帮忙解决一下,很急!!!
///////////////////////////////////////////////////////////////////////////////



Sleep(50);
sResult := UserInfo.sResult;
if sResult <> '' then begin
Terminate;
if frmAppServer.IdTCPClient1.Connected then
try
frmAppServer.IdTCPClient1.Disconnect;
except
//
end;
end;
Application.ProcessMessages;
except
on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
end;
end;
end;
...全文
150 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wg168 2004-04-27
  • 打赏
  • 举报
回复
TO halfdream(哈欠)
老大帮帮忙!!1
wg168 2004-04-25
  • 打赏
  • 举报
回复
服务器端这样写有错吗?
procedure THuiTongDDnsService.IdTCPServer1Execute(AThread: TIdPeerThread);
// IdTCPServer 执行事件
var
ActClient, RecClient: PClient;
UserInfo: TUserInfo;
ADOQuery1: TADOQuery;
strSql, strReturn: string;
RecThread: TIdPeerThread;
i: integer;
Log: TextFile;
begin

with Clients.LockList do
try
for i := 0 to Count - 1 do begin
RecClient := Items[i];
if RecClient.DNS = UserInfo.LocalName then
begin
RecThread := RecClient.Thread;
UserInfo.sResult := strReturn;
RecThread.Connection.WriteBuffer(UserInfo, SizeOf(UserInfo), True);
end;
end;
finally
Clients.UnlockList;
end;

end;

end;
halfdream 2004-04-24
  • 打赏
  • 举报
回复
既然是阻塞方式,你就让它线程一直在循环中运行就是啊。。
把frmAppServer.IdTCPClient1.Disconnect;这一句写在循环体外面。。


另外。。不要在工作线程里面随便加Application.ProcessMessages;



TO:solonet(赤岭雄鹰)
你的问题不应该还没有解决吧?
你的情况同这不一样,你的是非阻塞异步选项方式使用SOCKET,是主线程里面处理的。
细心些多想想吧,我看你贴子的全部回复已经把做法说得很清楚了。。

halfdream 2004-04-24
  • 打赏
  • 举报
回复
哦。你这是SOCKET的客户端程序?
读完数据后,服务端就断开了连接。。那是它的事。
wg168 2004-04-24
  • 打赏
  • 举报
回复
我改成这样:还是不行!

procedure TClientHandleThread.Execute;
var
UserInfo: TUserInfo;
begin
while not Terminated do begin
if not frmAppServer.IdTCPClient1.Connected then
Terminate
else
try
/////////////////////////////////////////////////////////////////////////
frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
这句执行完程序会去执行另外一个过程
IdTCPClient1Disconnected(Sender: TObject);

//////////////////////////////////////////////////////////////////////////
Sleep(50);
sResult := UserInfo.sResult;
except
on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
end;
end;
// if sResult <> '' then begin
// Terminate;
// if frmAppServer.IdTCPClient1.Connected then
// try
// frmAppServer.IdTCPClient1.Disconnect;
// except
// //
// end;
// end;
// Application.ProcessMessages;
end;
halfdream 2004-04-24
  • 打赏
  • 举报
回复
应该只是流程处理问题吧?

你的这句

if sResult <> '' then begin//楼主解释一下这句要判断什么呢?

Terminate;
if frmAppServer.IdTCPClient1.Connected then
try
frmAppServer.IdTCPClient1.Disconnect;
//为什么在这种情况下你要自己断开SOCKET呢?
except
//
end;
wg168 2004-04-24
  • 打赏
  • 举报
回复
TO halfdream(哈欠)


frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
并且 出现客户端出现下面异常!
‘Connection Closed Gracefully’
wg168 2004-04-24
  • 打赏
  • 举报
回复
我改成这样:还是不行!

procedure TClientHandleThread.Execute;
var
UserInfo: TUserInfo;
begin
while not Terminated do begin
if not frmAppServer.IdTCPClient1.Connected then
Terminate
else
try
frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
Sleep(50);
sResult := UserInfo.sResult;
except
on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
end;
end;
if sResult <> '' then begin
Terminate;
if frmAppServer.IdTCPClient1.Connected then
try
frmAppServer.IdTCPClient1.Disconnect;
except
//
end;
end;
// Application.ProcessMessages;
end;
wg168 2004-04-23
  • 打赏
  • 举报
回复
frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));

执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);

我想继续执行下面的语句,不希望执行IdTCPClient1Disconnected(Sender: TObject);

solonet 2004-04-22
  • 打赏
  • 举报
回复
谁能解决这个问题,就能解决楼上的问题?
http://expert.csdn.net/Expert/topic/2994/2994314.xml?temp=.7303888
solonet 2004-04-22
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2994/2994314.xml?temp=.7303888
aiirii 2004-04-22
  • 打赏
  • 举报
回复
表達的不清楚, 你想要解決什麼問題/?
wg168 2004-04-22
  • 打赏
  • 举报
回复
没人知道?

1,593

社区成员

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

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