|
이 부분이 문제가 아니라.
님은 포인터와 객체에 대해서 이해가 부족해요.
이부분이 부족하다는건.. 적어도 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");
: : :
: : : }
|