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
[20233] RS-232통신에서.. TThread를 가져다 썼을때 ReadFile에서 죽어버립니다..
kabaliero [] 1839 읽음    2002-07-19 10:53
XP에서 RS-232 통신 Error 를 수정하다가.. 문제가 있어서 질문드립니다.

전에는 CreateThread로 핸들을 얻어서 사용했었는데요.. Win98에서는 잘 돌아가는데..

XP에서 Thread를 CreateThread로 열면 WriteFile에서 죽어버리더군요..

그래서 다음과 같이 다시 코딩을 해봤습니다.. 그랬더니.. Thread안에 있는 ReadFile에서 다운이 되어버립니다.

답변 부탁드리겠습니다. 소스 아래 넣을께요..

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "test_1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

DCB DCBData;
HANDLE hComPort;
COMMTIMEOUTS CommTimeout;
DWORD id;

void DCB_Clear(void);
DWORD ReadThread (LPDWORD lpdwParam1);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   DCB_Clear();
   hComPort = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
   if(hComPort == INVALID_HANDLE_VALUE)
   {
      ShowMessage("Port의 핸들을 가져오는데 실패했습니다.");
      return;
   }
   if(SetupComm(hComPort, 4096, 4096) == false)
   {
      CloseHandle(hComPort);
      ShowMessage("포트 Buffer 설정에서 오류가 발생했습니다.");
      return;
   }
   if(PurgeComm(hComPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) == FALSE)
   {
      CloseHandle(hComPort);
      ShowMessage("Purge과정중 오류가 발생했습니다");
      return;
   }
   CommTimeout.ReadIntervalTimeout = 15;
   CommTimeout.ReadTotalTimeoutMultiplier = 0;
   CommTimeout.ReadTotalTimeoutConstant = 0;

   CommTimeout.WriteTotalTimeoutMultiplier = 0;
   CommTimeout.WriteTotalTimeoutConstant = 0;

   if(SetCommTimeouts(hComPort, &CommTimeout) == FALSE)
   {
      CloseHandle(hComPort);
      ShowMessage("Timeout 설정중에 오류가 발생했습니다.");
      return;
   }
   DCBData.BaudRate = CBR_9600;
   DCBData.ByteSize = 8;
   DCBData.Parity = NOPARITY;
   DCBData.StopBits = ONESTOPBIT;

   if(SetCommState(hComPort, &DCBData) < 0)
   {
      CloseHandle(hComPort);
      ShowMessage("SetCommState Error");
        return;
   }

   RXThread *T;
   T = new RXThread();   // 쓰레드 생성
}
//---------------------------------------------------------------------------

void DCB_Clear(void)
{
   DCBData.DCBlength = sizeof(DCB);
   DCBData.BaudRate = CBR_9600;
   DCBData.fBinary = FALSE;
   DCBData.fParity = FALSE;
   DCBData.fOutxCtsFlow = FALSE;
   DCBData.fOutxDsrFlow = FALSE;
   DCBData.fDtrControl = DTR_CONTROL_DISABLE;
   DCBData.fDsrSensitivity = FALSE;
   DCBData.fTXContinueOnXoff = FALSE;
   DCBData.fOutX = FALSE;
   DCBData.fInX = FALSE;
   DCBData.fErrorChar = FALSE;
   DCBData.fNull = FALSE;
   DCBData.fRtsControl = RTS_CONTROL_DISABLE;
   DCBData.fAbortOnError = FALSE;
   DCBData.fDummy2 = NULL;
   DCBData.XonLim = 0;
   DCBData.XoffLim = 0;
   DCBData.ByteSize = 8;
   DCBData.Parity    = NOPARITY;
   DCBData.StopBits = ONESTOPBIT;
   DCBData.XonChar = NULL;
   DCBData.XoffChar = NULL;
   DCBData.ErrorChar = NULL;
   DCBData.EofChar = NULL;
   DCBData.EvtChar = NULL;
   DCBData.wReserved1 = 0;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   PurgeComm(hComPort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
   if(CloseHandle(hComPort) == false)
      ShowMessage("COM1 Port 핸들을 닫는과정에서 오류가 발생했습니다.");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   LONG lrc;
   unsigned char TXBUF[1024] = {0};

   TXBUF[0]  = 0xC0;      // Test용 packet
   TXBUF[11] = 0xC0;

   if (!WriteFile(hComPort, TXBUF, 12, (LPDWORD)&lrc, NULL))
   {
      ShowMessage("WriteFile중 오류가 발생했습니다.");
      CloseHandle (hComPort);
   }
}
//---------------------------------------------------------------------------

__fastcall RXThread::RXThread(void) : TThread(true)
{
   FreeOnTerminate = true;
   Resume();
}
void __fastcall RXThread::Execute(void)
{
   while(!Terminated)
   {
      Synchronize(UpdateThread);
   }
}

void __fastcall RXThread::UpdateThread(void)
{
   unsigned char inbuff[1024];
   DWORD nBytesRead;

   if(!ReadFile(hComPort, inbuff, 1024, &nBytesRead, NULL))   // 여기서 다운.....
   {
      ShowMessage("ReadFile Error");
   }
   else
   {
      if(nBytesRead)
      {
         ShowMessage(IntToStr(nBytesRead) + "가 읽혔습니다.");
      }
   }
}

+ -

관련 글 리스트
20233 RS-232통신에서.. TThread를 가져다 썼을때 ReadFile에서 죽어버립니다.. kabaliero 1839 2002/07/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.