[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하게(?)ㅋ
:
: 이게 뭐를 잘못해서 나온 에러인지좀 알려주세요