全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1337
推到 Plurk!
推到 Facebook!

使用Indy->TcpServer 在 FormClose 發生 Exception 錯誤

缺席
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-05 14:11:29 IP:61.66.xxx.xxx 未訂閱
Greeting,    我在使用 D7 & Indy 9.0.0.14 中的 TCPServer 設計 Socket Server 時,有一個奇怪的現象,就是 每次我的 TCPServer.Active := True,當我程式要結束的時後,就會發生 Excetpion,如果 TCPServer.Active 沒有設定為 True,也就是沒有啟動 Server,當然就不會有此現象,我猜想是 Server 元件要 Terminate Thread 時發生 Exception,但是實在不知道為什麼會這樣,我的程式碼相當簡單,例如,啟動伺服器:    
var
  Binding: TIdSocketHandle;
  IPList: TStrings;
  i: Integer;
begin
  IPList := TStringList.Create;
  try
    IPList := GStack.LocalAddresses;
    IPList.Add('127.0.0.1');
    for i := 0 to IPList.Count - 1 do
    begin
      Binding := OMCServer.Bindings.Add;
      Binding.IP := IPList.Strings[i];
      Binding.Port := ServerPort.Value;
    end;
    try
      WriteLog(MSG_0003);
      OMCServer.Active := True;
      WriteLog(MSG_0004);
      btnStartServer.Enabled := False;
      btnStopServer.Enabled := True;
    except
      WriteLog(MSG_0005);
    end;
  finally
    IPList.Free;
  end;
結束伺服器:
  try
    WriteLog(MSG_0006);
    OMCServer.Active := False;
    OMCServer.Bindings.Clear;
    WriteLog(MSG_0007);
    btnStartServer.Enabled := True;
    btnStopServer.Enabled := False;
  except
    WriteLog(MSG_0008);
  end;
在伺服器的 Execute 事件中只有:
var
  CMD: string;
begin
  if not OMCServer.Active then Exit;
  CMD := AThread.Connection.ReadLn(#13, 50);
  if CMD = '' then Exit;
  CMD := uppercase(CMD);
  WriteLog(Format(MSG_0011, [AThread.Connection.Socket.Binding.PeerIP, CMD]));
另外在 FormClose 事件中是:
  if OMCServer.Active then btnStopServerClick(nil);
  WriteLog(MSG_0002);
  CloseFile(fLog);
上面的判斷式,用意是如果伺服器在運作中,會呼叫 StopServer Button 的 Click Event 去停止伺服器。 但是程式結束都會發生 Exception ,如下圖: 可否請各位賜教,謝謝您。
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-07 10:07:46 IP:61.221.xxx.xxx 未訂閱
davidsun你好: 加上...OnClose procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin IdTCPServer.Active := false; Action:=cafree; end;
------
======================
昏睡~
不昏睡~
不由昏睡~
liorex
初階會員


發表:19
回覆:60
積分:32
註冊:2002-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-09 17:12:00 IP:61.222.xxx.xxx 未訂閱
請問畫面中提到 WriteLog 這個procedure 有更新畫面嗎 若有試著將他拿掉看看 ---------------------- 一切有為法 如夢幻泡影 如露亦如電 應做如是觀 ----------------------
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-13 22:56:13 IP:61.66.xxx.xxx 未訂閱
謝謝兩位的熱心指點,我後來沒有使用 Indy 的元件,而改用 TurboPower 的 iPro 了。謝謝二位。
系統時間:2024-11-23 11:46:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!