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
[72774] Re:Re:Re:IdTCPServer에서 Execute에서만 송신을해야하나요? (수정)(도와주세요..)
Intotheblue [makerjh] 4194 읽음    2015-06-15 22:48
이 부분이 문제가 아니라.
님은 포인터와 객체에 대해서 이해가 부족해요.

이부분이 부족하다는건.. 적어도 c/c++로 뭔가 만들어 보겠다고 시도 하긴 어려워요.

포인터와 객체에 대한 부분은 책에서도 몇 챕터에 걸쳐서 설명하는 부분이라..
댓글로 공부할 내용은 아니구요..

최대한 간단히 설명하면..


1. TIdPeerThread *AThread; 이건 포인터 선언만 한겁니다.
이거 그대로 쓰면 당연히 access violation error 뜹니다.

2. 선언하면 할당을 해줘야 됩니다.
TIdPeerThread *AThread = new TIdPeerThread ;

아님 아래 처럼 이미 만들어진 객체를 땡겨오던가요 .

AThread = (TIdPeerThread *) List->Items[Loop];

이런식이죠 근데 님 코드엔 이게 없어요.

3. List 는 자료형입니다.
TList 는 객체나 데이터를 보관하는 자료형입니다.
여기에 객체나 데이터를 보관하고..

AThread = (TIdPeerThread *) List->Items[Loop];
이런 식으로 보관된 객체중 필요한걸 포인터로 땡겨오는거죠.

4. helpme 함수도 똑같습니다.
TList 를 정의만 하고 바로 쓰고 있죠.
당연히 에러 납니다.

그런다고 TList *List = new TList ;
하면 access violation error 는 안나겠지만.. 님이 원하는데로 동작하진 않습니다.

5. IdTCPServer1 에서 객체를 어떻게 처리하고 있는지 공부하셔야 됩니다.
님 코드 보면.. TThreadList 를 사용해서 처리하고 있는거 같은데..
이건  thread 에서 안전하게 사용하게 하기 위한 겁니다.

LockList 해서 Thread에서 안전하게 잠근뒤 TList 형을 얻고..
데이터 처리를 하고 UnloackList 로 다른 데서 사용 가능하게 풀어주는 방식으로 씁니다.

6. List->Count 와 List->Item 이 어떤 역활을 하는지 같은거는..
   보통은 이름으로 대충 판단하고..
   헬프를 보고 구체적인 내용을 판단한뒤..
   그래도 이해가 안되면 테스트 코드를 짜서 확실하게 이해하는 방식으로 접근합니다.





앱돌이 님이 쓰신 글 :
: 죄송하지만... 조금더 구체적으로 설명해주실 수 있을까요..
:
: 깊게 공부를 못한터라 어느 부분을 공부하면 좋을까요 ?
:
: 객체 생성부분이 없다는건 어떤 객체를 TIdPeerThread의 객체생성인가요?
:
: try{
:                 for(Loop = 0; Loop<List->Count; Loop++){
:                         AThread = (TIdPeerThread *) List->Items[Loop];
:                         AThread->Connection->WriteLn(shiftWork.STX+shiftWork.Line+shiftWork.From+shiftWork.To+shiftWork.Command+shiftWork.SendTime+shiftWork.ResultCode+
:         shiftWork.Size+shiftWork.HeaderEnd+shiftWork.StnId+shiftWork.McPort+shiftWork.Worker+shiftWork.MegId +shiftWork.ExWorker+shiftWork.ETX);
:                 }
:         }__finally{
:                 IdTCPServer1->Threads->UnlockList();
:         }
:
: 이런식으로 구성하여서 했더니 버튼을 눌렀을때 동작을 합니다.   일반 함수내부에서 사용하려고 했을때 입니다.  이렇게 하니
: 또 똑같은 오류가 이쪽에서 발생을 합니다.........하................................ 아는분의 조언으로 만든건대 아무 뜻도 모르고 만든거라
: List->Count와 List->Items는 어떤역할을 하는건가요? 해석좀.....부탁드리겠습니다.
:
: oid __fastcall TPBCICT::Helpme(int y)
: {
:         int Loop;
:         TList *List;
:         TIdPeerThread *AT;
: try{
:                 for(Loop = 0; Loop<List->Count; Loop++){
:                         AT = (TIdPeerThread *) List->Items[Loop];
:                         AT->Connection->WriteLn(GetInfo("Common","STX")+GetInfo("Common","line")+GetInfo("Common","myid")+GetInfo("Input","To")+GetInfo("Result","Command")+
:                         GetInfo("Common","SendTime")+GetInfo("Result","ResultCode")+GetInfo("TimeSet","Size")+GetInfo("Common","HeaderEnd")+GetInfo("Input","StnId")+
:                         GetInfo("Common","McPort")+GetInfo("Common","Worker")+GetInfo("Result",BarcodeSection[y])+GetInfo("Input","ICTModel")+
:                         GetInfo("Result","TestStartTime")+"^^^^^^^^^^"+GetInfo("Result","PCMCount")+GetInfo("Result","InspResult")+GetInfo("Result","PCMTestTime")+
:                         "^^"+GetInfo("Result","ItemCount")+GetInfo("Common","ETX"));
:
:
:                 }
:         }__finally{
:         IdTCPServer1->Threads->UnlockList();
:         }
:
:
: Intotheblue 님이 쓰신 글 :
: : 님 코드 보면..
: : athread 를 선언만 하고.. 객체 생성하는 부분이 없네요.
: : 당연히 에라가 날수 밖에 없죠.
: :
: : 앱돌이 님이 쓰신 글 :
: : : 이런식으로 AThread를 써서 송신을 하려고하는대요 자꾸 violation오류가 생깁니다. 화살표 되있는 부분에서
: : :
: : : 왜 에러가 생기고 해결방법좀 알려주세요 고수님들 부탁드립니다. ㅜ.ㅠ
: : :
: : :
: : : void __fastcall TPBCICT::Button3Click(TObject *Sender)
: : : {
: : :
: : :         TIdPeerThread *AThread;
: : :         struct MES shiftWork;
: : :
: : :         SaveInfo("shiftWork",Edit8->Text,"ExWorker");
: : :         SaveInfo("Common",SendTime,"SendTime");
: : :         shiftWork.STX = GetInfo("Common","STX");
: : :         shiftWork.Line = GetInfo("Common","line");
: : :         shiftWork.From = GetInfo("Common","myid");
: : :         shiftWork.McPort = GetInfo("Common","McPort");
: : :         shiftWork.To = GetInfo("Input","To");
: : :         shiftWork.Command = GetInfo("shiftwork","Command");
: : :         shiftWork.SendTime = GetInfo("Common","SendTime");
: : :         shiftWork.ResultCode = GetInfo("shiftwork","ResultCode");
: : :         shiftWork.Size = GetInfo("shiftwork","Size");
: : :         shiftWork.HeaderEnd = GetInfo("Common","HeaderEnd");
: : :         shiftWork.StnId = GetInfo("Common","StnId");
: : :         shiftWork.McPort = GetInfo("Common","McPort");
: : :         shiftWork.MegId = GetInfo("shiftwork","MegId");
: : :         shiftWork.ExWorker = GetInfo("shiftWork","ExWorker");
: : :         shiftWork.ETX = GetInfo("Common","ETX");
: : : ---->AThread->Connection->WriteLn(shiftWork.STX+shiftWork.Line+shiftWork.From+shiftWork.To+shiftWork.Command+shiftWork.SendTime+shiftWork.ResultCode+
: : :         shiftWork.Size+shiftWork.HeaderEnd+shiftWork.StnId+shiftWork.McPort+shiftWork.Worker+shiftWork.MegId +shiftWork.ExWorker+shiftWork.ETX);
: : :
: : :         if(shiftWork.Worker != shiftWork.ExWorker){
: : :                 Edit13->Text = "0";
: : :         }
: : :         SaveInfo("Common",shiftWork.ExWorker,"Worker");
: : :
: : : }

+ -

관련 글 리스트
72770 IdTCPServer에서 Execute에서만 송신을해야하나요? 앱돌이 4048 2015/06/15
72780     주제넘게 조언을 드리자면 오지랖대왕 4182 2015/06/16
72771     Re:IdTCPServer에서 Execute에서만 송신을해야하나요? Intotheblue 4200 2015/06/15
72772         Re:Re:IdTCPServer에서 Execute에서만 송신을해야하나요? (수정)(도와주세요..) 앱돌이 4242 2015/06/15
72774             Re:Re:Re:IdTCPServer에서 Execute에서만 송신을해야하나요? (수정)(도와주세요..) Intotheblue 4194 2015/06/15
72781                 Re:Re:Re:Re:IdTCPServer에서 Execute에서만 송신을해야하나요? (수정)(도와주세요..) 앱돌이 4268 2015/06/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.