C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[54911] Re:Re:델파이를 builder로;;;;;
너브 [nervegum] 2370 읽음    2008-10-16 13:18
항상 감사드립니다.
많은 도움이 되었습니다.

사용한 인디예제는 처음 질문에 첨부한 화일 입니다.
indy9의 IdTCPDemos 입니다.

하나씩 CB로 변환중에 막힌 부분이 있어 다시 질문 올립니다.

procedure TServerFrmMain.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;

begin
  GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS         := AThread.Connection.LocalName;
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      :=AThread;

  AThread.Data:=TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;

  Protocol.Lines.Add(TimeToStr(Time)+' Connection from "'+NewClient.DNS+'"');
end;

우선 임프님이 해 주신데로 구조체로 해서 다시 도전했습니다. DNS부분은 AnsiString으로 바꾸었습니다.

void __fastcall TForm1::IdTCPServer1Connect(TIdPeerThread *AThread)
{
    TClient* NewClient;

    NewClient                 = new TClient;
    NewClient->DNS             = AThread->Connection->LocalName;
    NewClient->Connected     = Now();
    NewClient->LastAction     = NewClient->Connected;
    NewClient->Thread         = AThread;

    AThread->Data = (TObject*)NewClient ;        /// ???????????????????;

    try {
        Clients->LockList();                     //TThreadList* Client;
        Clients->Add(NewClient);
    }
    __finally {
        Clients->UnlockList();
    }
    Protocol->Lines->Add(TimeToStr(Now()) + " : Connection from " + NewClient->DNS);
}

위의 중간을 보면  AThread->Data = (TObject*)NewClient;
로 해서 구조체의 데이터를 그데로 AThread에 넘겨 주는거 같은데...


procedure TServerFrmMain.ServerDisconnect(AThread: TIdPeerThread);
var
  ActClient: PClient;

begin
  ActClient := PClient(AThread.Data);
  Protocol.Lines.Add (TimeToStr(Time)+' Disconnect from "'+ActClient^.DNS+'"');
  try
    Clients.LockList.Remove(ActClient);
  finally
    Clients.UnlockList;
  end;
  FreeMem(ActClient);
  AThread.Data := nil;
end;
--------------------------------------------------------------------
void __fastcall TForm1::IdTCPServer1Disconnect(TIdPeerThread *AThread)
{
    TClient* ActClient;

    ActClient = new TClient;
    //ActClient = AThread->



}
델파이에선
ActClient := PClient(AThread.Data);
이런식으로 바로 받은것 같은데
구조체에 생성자가 없는데 어떻게 받은건가요?
생성자를 만들어 줘야 되는 건가요???
만들어야 된다면 AThread->Data를 형변환 해야 되는 건가요?
TObject로 받은 것을 어떻게 구조체에 넘겨줘야 되나요?

/////
어떤 클레스(또는 구조체)를 AThread->Data로 형변환을 해서 넘겨주면;;;;
다른 곳에서 어떻게 받아야 되나요????

ActClient 는 구조체이고
AThread->Data는 TObject 이던데;;;;;

이렇게 항상 도움을 주셔서 감사합니다.
제가 잘 몰라서 질문이 엉망인것 같네요....
그럼 오늘도 멋진 하루 보내세요...^^


박지훈.임프 님이 쓰신 글 :
: 인디의 어떤 예제 소스를 보시는지 몰라서 구체적으로 설명하기는 어렵습니다만...
:
: 1. 델파이의 record는 기본적으로 C++의 struct와 같다고 생각하시면 됩니다.
: 2. String[20]을 char[20]이라고 쓴 것은, 완벽하게 같지는 않지만 실제로는 거의 비슷하므로 별 문제가 없을 겁니다.
: 3. TDateTime은 실제로는 double 타입이므로, struct에서 TDateTime라고 똑같이 쓰시면 됩니다.
: 4. ^TClient와 같이 델파이에서 ^라고 쓰는 것은 포인터를 의미합니다.
: 5. 델파이에서 PClient   = ^TClient;처럼 한 라인로만 된 타입 선언은 C++에서 typdef와 같다고 보면 됩니다.
: 6. 델파이의 Pointer는 엄밀하게는 C++에서 void *라고 보는게 맞지만, 쓰신 것처럼 해당 타입의 포인터로 해도 되겠죠.
:
: 따라서 대략 다음과 같이 되겠군요.
:
: struct TClient
: {
:     char DNS[20];
:     TDateTime Connected;
:     TDateTime LastAction;
:     TIdPeerThread* Thread;
: };
:
: typedef TClient * PClient;
:
: TThread에서 오버라이드하는 이유는 델파이건 C++빌더건 같습니다. TThread는 아무것도 못하는 멍텅구리 클래스이고, 실제로 쓰레드를 구현하려면 TThread를 상속받아 실제로 일을 할 쓰레드 클래스를 작성해야 합니다. 다시 말해서, Execute를 오버라이드해서 코딩을 하는 것이 TThread 상속 클래스를 작성하는 데 있어 가장 핵심입니다.
:
: 여기서 Execute() 멤버 함수가 실제 쓰레드 내부에서 할 작업, 즉 그 쓰레드에게 시킬 일을 코딩하게 됩니다. 그래서 TThread 상속 클래스를 작성할 때는 당연히 Execute 멤버 함수를 직접 작성해야 합니다.
:
: 그럼 처음부터 아예 Execute() 멤버 함수를 코딩하게 하지 왜 오버라이드를 하느냐 하면, TThread 클래스에서 내부적으로 win32 쓰레드에게 일을 시키기 위해 Execute()를 호출해야 하기 때문에 TThread 클래스가 Execute를 알아야 합니다. TThread를 상속받은 클래스에서 오버라이드가 아닌 Execute를 처음부터 만든다면, TThread 클래스에서는 Execute를 모르기 때문에 호출은 커녕 컴파일 에러가 나서 컴파일도 안됩니다.
:
: 아주 오래전에 썼던 팁이지만, 다음 팁도 참고하세요.
:
: 팁! 쓰레드의 기초
: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=36
:
:
:
: nervegum 님이 쓰신 글 :
: : 한번도 해보지 않을 부분을 시도해보려 하니 참으로 맨땡에 해댕하고 있는 기분이네요...
: : Indy10으로 도전하려다가 그래도 Indy9가 데모가 많이 있는 것 같아서 컴포넌트 다시 설치하고
: : 시작을 했는데 여전히 막히는 부분이 많네요....
: :
: : Indy9의 IdTCPServer + IdTCPClient의 간단한 예제는
: : www.codeway.co.kr 의 류종택님의 강의를 참고해서 (사실 그래도 따라하기;;;;)
: : 대충은 이해했습니다.
: : (저같은 초보자한테는 크나큰 도움이 되었습니다.)
: : 좀더 공부해보려고 Indy9 데모(델파이용)를 다운 받아서 조금씩 코드를 바꿔가면서 실행하던 도중....
: :
: : 구조체(클래스?)부분하고 쓰레드 부분이 문제가 됩니다.(델파이 문법을 몰라서;;;)
: : (사실은 빌더 쓰레드도 사용해 본적은 없습니다. 책보고 한번 따라해 본적밖에;;;)
: :
: : 저의 넋두리 였구요;;;;
: :
: : Indy 9 demos를 보고 공부하던 도중....
: : 구조체 부분 같은데 C로 어떻게 변환을 해야 되는지 모르겠씁니다.
: : 도와주세요...
: :
: : ---------------------------------------------------------------
: : type
: :   PClient   = ^TClient;
: :   TClient   = record  // Object holding data of client (see events)
: :                 DNS         : String[20];            { Hostname }
: :                 Connected,                           { Time of connect }
: :                 LastAction  : TDateTime;             { Time of last transaction }
: :                 Thread      : Pointer;               { Pointer to thread }
: :               end;
: : ---------------------------------------------------------------
: :
: : 제 나름대로의 변환(??)은 아래와 같습니다.....????
: :
: : class PClient
: : {
: :  // PCLient = ^TClient;    //????????????????????????????
: : 
: : public:
: :     char DNS[20];
: :     char Connected[20];
: :     char LastAction[20];
: :     TIdPeerThread* Thread;               // <-----------?????
: : } ;
: :
: :
: : 2. 그리고 GetMem() 함수와 Nwe() 함수의 차이는 무었인가요???
: :
: : 쩝 어렵네요???
: : Indy9 데모중   IdTCPServer + IdTCPClient 첨부합니다.
: :
: :
: : 그리고 클라이언트 부분에서...
: : --------------------------------------------------
: :  TClientHandleThread = class(TThread)
: :                          private
: :                           CB: TCommBlock;
: :
: :                           procedure HandleInput;
: :
: :                          protected
: :                           procedure Execute; override;
: :
: :                         end;
: : --------------------------------------------------
: : 쓰레드 부분 같은데...
: : 오버라이딩 한 이유는 무엇인가요??? (전체 소스를 봐야 알수 있을까요???)
: :
: :
: :
: : C++ 빌더로 된 Indy9 소스는 어디 없을까요?? ㅜ.ㅜ

+ -

관련 글 리스트
54868 델파이를 builder로;;;;; nervegum 2072 2008/10/13
54889     Re:델파이를 builder로;;;;; 박지훈.임프 2243 2008/10/15
54911         Re:Re:델파이를 builder로;;;;; 너브 2370 2008/10/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.