為何Server Socket 程式關閉時會產生stack overflow |
答題得分者是:Justmade
|
yabula
初階會員 發表:47 回覆:117 積分:42 註冊:2002-10-02 發送簡訊給我 |
若程式是在delphi 5 的環境下去執行,當關閉程式時會產生stack overflow,但若是直接執行執行檔的話就不會有此error message,請為各位前輩為什ㄇ,這樣會對程式有何影響?? unit server; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ScktComp; type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
ServerSocket1: TServerSocket;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
procedure ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject);
begin ServerSocket1.Active:=true;
StatusBar1.Panels[0].Text:='Listening.........';
Button1.Enabled:=false;
Button2.Enabled:=true;
end; procedure TForm1.Button2Click(Sender: TObject);
begin
ServerSocket1.Active:=false;
StatusBar1.Panels[0].Text:='Discononection';
Button2.Enabled:=false;
Button1.Enabled:=true; end; procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels[0].Text:='Accept Connection From:'
Socket.RemoteAddress;
end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels[0].Text:='Connected from:'
Socket.RemoteAddress;
end; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels[0].Text:='Disconnected from:'
Socket.RemoteAddress; end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels[0].Text:='Message from:'
Socket.RemoteAddress;
Edit2.Text:=Socket.ReceiveText; end; procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_Return then
ServerSocket1.Socket.Connections[0].SendText(Edit1.text);
end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ServerSocket1.Close;
Close;
end; procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ShowMessage('Server:Client Error');
end; procedure TForm1.ServerSocket1GetSocket(Sender: TObject; Socket: Integer;
var ClientSocket: TServerClientWinSocket);
begin
StatusBar1.Panels[0].Text:='Get Socket';
end; procedure TForm1.ServerSocket1Listen(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.Panels[0].Text:='Server Listen'; end; end. 發表人 - yabula 於 2003/03/25 10:03:38
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 若程式是在delphi 5 的環境下去執行,當關閉程式時會產生stack overflow,但若是直接執行執行檔的話就不會有此error message,請為各位前輩為什ㄇ,這樣會對程式有何影響??Stack Overflow 的主要成因是一個程式段不斷直接或間接地呼叫自己,而在你上面 FormClose 時呼叫 close 而再次引發 formclose, 在新執行的 formclose 又呼叫 close 而再次引發 formclose, 在新執行的....直至 stack 資源沒有了就會出現 stack overflow。 將那個 close; 刪掉就可以了。 至於獨立執行沒事,應只是沒顯示出 error,程式應是當了仍佔用資源。procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ServerSocket1.Close; Close; end; |
yabula
初階會員 發表:47 回覆:117 積分:42 註冊:2002-10-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |