程序如下:
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;
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;
http://expert.csdn.net/Expert/topic/2994/2994314.xml?temp=.7303888
把frmAppServer.IdTCPClient1.Disconnect;这一句写在循环体外面。。
另外。。不要在工作线程里面随便加Application.ProcessMessages;TO:solonet(赤岭雄鹰)
你的问题不应该还没有解决吧?
你的情况同这不一样,你的是非阻塞异步选项方式使用SOCKET,是主线程里面处理的。
细心些多想想吧,我看你贴子的全部回复已经把做法说得很清楚了。。
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;
frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
并且 出现客户端出现下面异常!
‘Connection Closed Gracefully’
if frmAppServer.IdTCPClient1.Connected then
try
frmAppServer.IdTCPClient1.Disconnect;
//为什么在这种情况下你要自己断开SOCKET呢?
except
//
end;
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;
读完数据后,服务端就断开了连接。。那是它的事。
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;
老大帮帮忙!!1