我使用INDY控件编写数据接收程序,采用单独线程接收,基于阻塞式的,可是当关闭事总是出现错误啊!后来,我仔细研究了indy控件的例子,也是同样的错误.不明白他们有BUG还要拿出来示人?我使用的是:IdTCPClient和IdTCPServer.
下面是单独线:unit Unit_MyThread;interfaceuses
Classes,Sockets,windows,dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient,SysUtils;type
MyTCPThread = class(TThread)
private
idTCPClient1: TidTCPClient;
str:string;
protected
procedure Execute; override;
public
constructor Create(client:TIDtcpclient);
procedure Terminate;
Procedure tt();
Procedure setFlag();
end;implementation
uses unit2;{ MyTCPThread }constructor MyTCPThread.Create(client:TIDtcpclient);
begin
inherited Create(false);
FreeOnTerminate:=true;
idTCPClient1.Host:=client.Host;end;procedure MytcpThread.Terminate;
begin
fORM1.ThreadIsExit:=0;
inherited;
end;procedure MyTCPThread.Execute;
var
Count: Integer;
P: PByte;
s:array [0..255] of char;
begin
Synchronize (setflag);
while (not Terminated) and IdTCPClient1.Connected do
begin
try
str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
Synchronize (tt);
except
showmessage('disconn');
idTCPClient1.Disconnect;
break;
end;
end;
end;procedure MyTCPThread.setflag();
begin
form1.ThreadIsExit:=1;
end;Procedure MyTCPThread.tt();
begin
Form1.Memo1.Lines.Add(trim(str));
end;end.
下面是单独线:unit Unit_MyThread;interfaceuses
Classes,Sockets,windows,dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient,SysUtils;type
MyTCPThread = class(TThread)
private
idTCPClient1: TidTCPClient;
str:string;
protected
procedure Execute; override;
public
constructor Create(client:TIDtcpclient);
procedure Terminate;
Procedure tt();
Procedure setFlag();
end;implementation
uses unit2;{ MyTCPThread }constructor MyTCPThread.Create(client:TIDtcpclient);
begin
inherited Create(false);
FreeOnTerminate:=true;
idTCPClient1.Host:=client.Host;end;procedure MytcpThread.Terminate;
begin
fORM1.ThreadIsExit:=0;
inherited;
end;procedure MyTCPThread.Execute;
var
Count: Integer;
P: PByte;
s:array [0..255] of char;
begin
Synchronize (setflag);
while (not Terminated) and IdTCPClient1.Connected do
begin
try
str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
Synchronize (tt);
except
showmessage('disconn');
idTCPClient1.Disconnect;
break;
end;
end;
end;procedure MyTCPThread.setflag();
begin
form1.ThreadIsExit:=1;
end;Procedure MyTCPThread.tt();
begin
Form1.Memo1.Lines.Add(trim(str));
end;end.
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
Thread2:=MyTCPThread.Create(idtcpclient1);
Thread2.FreeOnTerminate:=true;
Thread2.Resume;
end;
Classes,Sockets,windows,dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient,SysUtils;type
MyTCPThread = class(TThread)
private
idTCPClient1: TidTCPClient;
str:string;
protected
procedure Execute; override;
public
constructor Create(client:TIDtcpclient);
procedure Terminate;
Procedure tt();
Procedure setFlag();
end;implementation
uses unit2;{ MyTCPThread }constructor MyTCPThread.Create(client:TIDtcpclient);
begin
inherited Create(false);
FreeOnTerminate:=true;
idTCPClient1:=client;
end;procedure MytcpThread.Terminate;
begin
fORM1.ThreadIsExit:=0;
inherited;
end;procedure MyTCPThread.Execute;
var
Count: Integer;
P: PByte;
s:array [0..255] of char;
begin
Synchronize (setflag);
while (not Terminated) and IdTCPClient1.Connected do
begin
try
str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
Synchronize (tt);
except
showmessage('disconn');
idTCPClient1.Disconnect;
break;
end;
end;
end;procedure MyTCPThread.setflag();
begin
form1.ThreadIsExit:=1;
end;Procedure MyTCPThread.tt();
begin
Form1.Memo1.Lines.Add(trim(str));
end;end.
Synchronize (tt);
你这两句改成下面那样:
try
str:=idTCPClient1.ReadLn();
Synchronize (tt);
except
Exit;
end;改了之后调试时(即用Delphi上的运行时)还会有错,直接执行编译的exe就不再提示出错了.