使用TTCPServer类在退出程序时随机出现访问地址0异常(100)

  • 主题发起人 主题发起人 zml2006
  • 开始时间 开始时间
Z

zml2006

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TTCPServer写了个简单的例子,但是在关闭程序时有时会出现异常,有时不会。我没有在窗体上放TTCPServer控件,而是在Create事件中创建并初始化,在Destroy事件中释放。代码如下:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Sockets;type TForm1 = class(TForm) procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FTCPServer: TTCPServer; procedure Accept(Sender: TObject; ClientSocket: TCustomIpClient); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormDestroy(Sender: TObject);begin FreeAndNil(FTCPServer);end;procedure TForm1.FormCreate(Sender: TObject);begin FTCPServer := TTCPServer.Create(Self); FTCPServer.LocalHost := 'localhost'; FTCPServer.LocalPort := '2121'; FTCPServer.OnAccept := Accept; FTCPServer.Active := True;end;procedure TForm1.Accept(Sender: TObject; ClientSocket: TCustomIpClient);begin begin while true do begin if ClientSocket.WaitForData(0) then begin if CompareText(ClientSocket.Receiveln(), 'exit') = 0 then begin ClientSocket.Sendln('byebye you'); Exit; end; end; end; endend;end.帮忙看看是什么问题哦。
 
procedure TForm1.FormDestroy(Sender: TObject);begin while FTCPServer.Connection.Count > 0 do Sleep(10); FreeAndNil(FTCPServer);end;
 
to 白河愁: 你给的代码没法通过编译。我用的delphi7。这个异常确实和FTCPServer.Active := True;有关,把这行代码去掉就不发生异常了。但是我得用这个控件呀,还有其他办法么?
 
你必须先把所有连上你SERVER的 CLIENT都踢走,才可以关闭。
 
好像不是这个原因。理由如下:1.运行编译后的程序,确保没有任何连接,这时退出程序时也会发生异常。2.如果改成把TTCPServer控件放在窗体上,并且把TTCPServer.Create和FreeAndNil(FTCPServer);语句去掉,即使有连接程序也不会发生异常。3.如果把BlockMode改为bmNonBlocking而不是bmThreadBlocking,也不会发生异常。所以怀疑是delphi代码中与线程相关的部分的问题。
 
如果是 阻塞模式 的话,这个控件的线程部分是要自己写的,跟DELPHI 没关系。
 
TTCPServer有三种模式,非阻塞,阻塞,线程阻塞;我做测试,所以没改他的线程,我认为他默认也应该能运行的很好的,但事实上不是这个样子。查找原因要花很多时间去看VCL架构的源代码,所以我准备先用WinSock的API自己封装这个功能了。这个问题先不查了。谢谢白河愁耐心的指点。
 
后退
顶部