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
[58464] Re:쓰레드를 이용한 시리얼 통신 질문입니다.
장성호 [nasilso] 1885 읽음    2009-09-09 11:32
[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 1316 2009/09/09
58464     Re:쓰레드를 이용한 시리얼 통신 질문입니다. 장성호 1885 2009/09/09
58496         Re:Re:장성호님은 이런 지식을 어디서 습득하시는 겁니까? 김민호.소중한꿈 1487 2009/09/10
58498             Re:Re:Re:장성호님은 이런 지식을 어디서 습득하시는 겁니까? 장성호 1751 2009/09/10
58502                 Re:Re:Re:Re:답변 감사합니다. 김민호.소중한꿈 1135 2009/09/10
58469         Re:Re:감사합니다. Kenzuro 952 2009/09/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.