안녕하세요.
저는 현재 5개의 COM PORT를 이용하는 F.A.S/W(RS422)를 개발 중입니다.
사용 중인 통신용 VCL에서 제공되는 메소드(OnReceiveData)를 이용하면,
DataSize가 틀리게 들어오는 경우가 많습니다.
그래서 멀티쓰레드를 이용, 데이터를 직접 받아 처리하고 있습니다(ReadData).
문제는.. 2시간 정도 지난 후, 'kernel32.dll 오류'가 발생한다는 것입니다.
API함수를 잘못 사용한 경우, 위와 같은 에러가 발생할 수 있다고 들었습니다.
제가 사용한 API함수는 쓰레드를 생성하는 CreateThread() 입니다.
Thread := CreateThread(nil, 0, @txrx, nil, 0, idtxrx);
쓰레드로 사용될 함수는 다음과 같이 선언하였습니다.
function txrx(p: pointer): LongInt;
그리고 5개의 MDIChild Form에 포트별로 각각 적용하였습니다.
SendMessage와 같은 함수는 익숙하지 않아서 사용하지 못하고,
Edit, Label, Panel, Memo와 같은 컴포넌트를 직접 컨트롤하였습니다.
CreateThread()의 두번째 파라미터인 dwStackSize를 조정하면(현재: 0),
해결이 가능할 수도 있다던데.. 어떻게 설정해야할지 모르겠습니다.
과연 StackSize가 문제인지.. 아니면 다른 문제가 있는 것인지..
많은 고수님들의 조언을 부탁드립니다.
(참고로 Delphi 5를 사용하여 MDI Form으로 작성하였으며, )
(통신컴포넌트는 CommPortDriver(or CPDrv)를 사용하였습니다.)
질문 내용이 너무 부실했나보군요.
해결 방법을 생각하다가...
쓰레드함수 내부의 루프를 없애버리고 타이머를 이용하였습니다.
쓰레드함수가 끝나면 타이머를 동작시키고,
타이머 이벤트에는 쓰레드 생성 후, 타이머를 중단시키는 코드를 작성했습니다.
아직까지 별 문제는 없는 것같은데... 불안합니다.
위와 같이 쓰레드 5개의 생성/종료를 반복시키고 있는데,
또 다른 문제가 발생하지는 않을까요?
그리고 이런 방식에서 쓰레드 사용의 의미가 있는 것일까요?
근본적인 해결이 아닌... 잔머리 굴리는 것같아서 좀 그러네요...
고수님들... 제발... 도와주세여~~~!!!