jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
使用 Indy 的 TCPServer 元件時在 TCPClient connect 時可以觸發 OnConnect 的事件, 但是在 TCPClient disconnect 時, 卻不能如預期觸發 OnDisconnect 的事件, 請問是為什麼, 除了故意引發 exception 外, 有沒有方法可解.
我用 ServerSocket 及 ClientSocket 的話, 事件皆正常(OnClientConnect, OnClientDisconnect) 不會有這種異狀. Jesse Chan
------ Jesse Chan
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
//Server 的程式
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (IdTCPServer1->Active == false)
{
IdTCPServer1->Active = true;
if (IdTCPServer1->Active == true)
Button1->Caption = "Deactive";
}
else
{
IdTCPServer1->Active = false;
if (IdTCPServer1->Active == false)
Button1->Caption = "Active";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Execute(TIdPeerThread *AThread)
{
//不做任何事.
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Disconnect(TIdPeerThread *AThread)
{
Caption = Now().DateTimeString() AnsiString().sprintf(" X Disconnect",AThread->ThreadID);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Connect(TIdPeerThread *AThread)
{
Caption = Now().DateTimeString() AnsiString().sprintf(" X Connect",AThread->ThreadID);
}
//---------------------------------------------------------------------------
Jesse Chan 發表人 - jessechan 於 2003/12/09 15:38:16 發表人 - jessechan 於 2003/12/09 15:41:35
------ Jesse Chan
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
//Client 端的程式
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Button1->Caption == "Connect")
{
IdTCPClient1->Connect(0);
if (IdTCPClient1->Connected() == true)
Button1->Caption = "Disconnect";
}
else
{
IdTCPClient1->Disconnect();
if (IdTCPClient1->Connected() == false)
Button1->Caption = "Connect";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Disconnected(TObject *Sender)
{
Caption = "Disconnect";
}
//---------------------------------------------------------------------------
Jesse Chan
------ Jesse Chan
|
jessechan
版主
發表:109 回覆:394 積分:254 註冊:2002-04-05
發送簡訊給我
|
昨天和包子討論一下, 知道這是 Indy 的 bug, 也就是只能知道 OnConnect, 無法知道 OnDisconnect. 包子曾 post 到 Indy 的網站上, 但是後來沒有消息, 不知道有沒有 Delphi 的高手可以看一下 source code 解決這個問題.
另外在我的 sample 中有一個錯誤, 就是在 IdTCPServer1Disconnect/Connect 中改變 Caption, 這個動作必須在 Synchronize 中完成才對, 一併提出以免下次有人和我犯一樣的錯, 因為包子沒有貼上來, 這題的分數只好欠著, 下次請你吃飯時你可以多叫一顆滷蛋. Jesse Chan
------ Jesse Chan
|