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
[58469] Re:Re:감사합니다.
Kenzuro [kenzuro83] 952 읽음    2009-09-09 14:53
정말 감사합니다~!!! 에러를 잡아주신데다가 문제점까지 짚어주시다니 ㅜ.ㅜ
앞으로도 잘 부탁드립니다 ㅎㅎ

장성호 님이 쓰신 글 :
: [AccessViolation원인]
: Design-time때   폼위에 컴포넌트나 컨트롤을 올려놓으면
:
: Form이 생성될때 자동으로 폼위의 모든 컴포넌트 객체가 생성됩니다.
:
: 하지만 직접 class를 설계하고 멤버변수로  TApdComPort 같은것을 두었을경우에는
: 직접 new로 생성해줘야 합니다.
:
: 님의 코드르 보면 AccessViolation이 발생했는데....
: 'Write of address' 부분을 보면   '00000078' 입니다.
:
: ComPort->AutoOpen = false 코드에서   0x00000078 번지에 write하려고 한것입니다.
:
: 이는 ComPort가 NULL( 또는  0 ) 인경우에 발생합니다.
: TApdComPort 클래스 시작부분에서 부터  0x78 Byte위치에  AutoOpen 변수가 있기때문이죠
:
:
: 즉 님의 경우
: TBmmsThread::ComportCnt() 함수에서
:
: ComPort->AutoOpen 등에 접근하기 전에 ComPort가 생성되어있는지 확인하고
: 객체를 생성해주시면 됩니다.
:
: void __fastcall TBmmsThread::ComportCnt()
: {
:     //다음과 같이..
:     if(ComPort==NULL) 
:           ComPort = new TApdComPort(NULL);
:  
: 
:     ComPort->AutoOpen = false;
:     //생략..
: 
: }
: 

: --------------------------------------------------------------------------------
: [코드에 다른 문제들]
: 그리고 만약 TBmmsThread가 정말 쓰레드 클래스이구
: TBmmsThread::ComportCnt() 가 메인쓰레드가 아닌 다른 쓰레드에서 호출한다면
: TBmmsThread::ComportCnt() 함수에 몇가지 문제가 더 있습니다.
:
: 1. 첫째 쓰레드에서 Form1->BaudEdit->Text 나 Form1->ComportEdit->Text 등 GUI 객체의 변수에 직접 접근하셨습니다.
:     크게 TEdit는 edit를 상속받은것으로 text에 내용을 가져오려면
:      
:      GetWindowText(Edit->Handle,...) 또는 SendMessage(Edit->Handle , WM_GETTEXT , ...) 로 동작합니다.
:     메인쓰레드랑 동기되어서 동작하죠
:
:     뭐 큰문제는 아니지만 별로 바람직하지 않습니다.
:
:
: 2. 둘째  ShowMessage를 호출하셨는데...
:      ShowMessage는 TForm을 상속받은 TMessageForm을 생성해서 ShowModal로 보여줍니다.
:      VCL의 Form이나 Control을 멀티쓰레드 환경에 맞춰 설계되어잇지 않기때문에
:
:      ShowMessage할때 에러가 날수도 있구 , 화면이 이상하게 나올수도 있습니다.
:
:      쓰레드에서 ShowMessage쓰는것은 문제가 있습니다.
:
:      정쓰고 싶으면 MessageBoxA 라는 win32api를 쓰셔야 됩니다.
:
:
: 그럼..
:
:
: Kenzuro 님이 쓰신 글 :
: : 쓰레드를 이용해서 시리얼 통신을 하는데요.. 쓰레드 사용하지 않고 컴포트로 시리얼 통신해서 정보 받는것은
: : 성공을 했습니다. 하지만 쓰레드를 사용해서 컴포트를 연결 하려고 하니 첨부파일과 같은 에러가 생깁니다.
: : 이것이 무엇에 대한 에러인지가 궁금합니다. APRO컴포넌트 사용해서 컴포트 만들었고요 폼에서 만들어서 하는게
: : 아니라 스레드에서 제가 선언해주면서 만들고 있습니다 Dynamic하게(?)ㅋ
: :
: : 이게 뭐를 잘못해서 나온 에러인지좀 알려주세요

+ -

관련 글 리스트
58462 쓰레드를 이용한 시리얼 통신 질문입니다. Kenzuro 1317 2009/09/09
58464     Re:쓰레드를 이용한 시리얼 통신 질문입니다. 장성호 1886 2009/09/09
58496         Re:Re:장성호님은 이런 지식을 어디서 습득하시는 겁니까? 김민호.소중한꿈 1487 2009/09/10
58498             Re:Re:Re:장성호님은 이런 지식을 어디서 습득하시는 겁니까? 장성호 1751 2009/09/10
58502                 Re:Re:Re:Re:답변 감사합니다. 김민호.소중한꿈 1136 2009/09/10
58469         Re:Re:감사합니다. Kenzuro 952 2009/09/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.