線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1264
推到 Plurk!
推到 Facebook!

為何Server Socket 程式關閉時會產生stack overflow

答題得分者是:Justmade
yabula
初階會員


發表:47
回覆:117
積分:42
註冊:2002-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-25 10:01:47 IP:61.220.xxx.xxx 未訂閱
若程式是在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-25 11:07:55 IP:218.16.xxx.xxx 未訂閱
引言: 若程式是在delphi 5 的環境下去執行,當關閉程式時會產生stack overflow,但若是直接執行執行檔的話就不會有此error message,請為各位前輩為什ㄇ,這樣會對程式有何影響??
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ServerSocket1.Close;
   Close;
end;
Stack Overflow 的主要成因是一個程式段不斷直接或間接地呼叫自己,而在你上面 FormClose 時呼叫 close 而再次引發 formclose, 在新執行的 formclose 又呼叫 close 而再次引發 formclose, 在新執行的....直至 stack 資源沒有了就會出現 stack overflow。 將那個 close; 刪掉就可以了。 至於獨立執行沒事,應只是沒顯示出 error,程式應是當了仍佔用資源。
yabula
初階會員


發表:47
回覆:117
積分:42
註冊:2002-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-25 11:31:33 IP:61.220.xxx.xxx 未訂閱
原來如此,ok了,謝謝前輩。
系統時間:2024-05-04 5:47:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!