인디의 어떤 예제 소스를 보시는지 몰라서 구체적으로 설명하기는 어렵습니다만...
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 소스는 어디 없을까요?? ㅜ.ㅜ