오랑캐꽃님 답변 잘 보았습니다. 몇 일간 홈피에 접속이 되지 않아 답글을 달지 못했습니다. 쓰레드 처리가 답인 것 같군요. 델마당에
서 IOCP에 관련된 자료 다운 받았습니다, 곧 테스트 해보려구요~ 도움 주셔서 대단히 감사 합니다. ^^
오랑캐꽃 님이 쓰신 글 :
: 원격지의 DB에 저장하는 코드를 굴리는 곳이 메인쓰레드인가요?
: 만약 그렇다면 다른 쓰레드에 위임해 처리 해 보세요.
:
: 지금 사용중인 OS가 윈도우라면 IOCP를 추천합니다.
: 델마당의 게임제작게시판에서 IOCP로 검색해보시면, 탈퇴하면서 미처 삭제하지 못한
: IOCPHandler 라는 물건이 남아 있습니다.
:
: 대충 이런 기반 객체를 만들어놓고
:
:
: TMyWorkObj = class
: OL: TOverlapped;
: procedure Execute; virtual; abstract;
: end;
:
:
:
: 폼에는 IOCPHandler 를 생성하고 IO완료 이벤트를 만들어줍니다.
:
:
: TForm1 = class(TForm)
: ...
: IOCPHandler: TIOCPHandler;
: procedure IOCompletion(Sender: TObject; IsSuccess: BOOL;
: OutErrCode, BytesTransferred, CompletionKey : DWORD; lpOverlapped: POverlapped);
:
: ....
:
: procedure TForm1 .IOCompletion(Sender: TObject; IsSuccess: BOOL;
: OutErrCode, BytesTransferred, CompletionKey: DWORD;
: lpOverlapped: POverlapped);
: begin
: try
: TMyWorkObj(CompletionKey).Execute;
: except
: on E: Exception do
: begin
: // WriteLn('*************** 서브스레드에서 예외발생! ', E.Message);
: end;
: end;
:
: TMyWorkObj(CompletionKey).Free;
: end;
:
:
:
: 폼의 생성자에서 IOCP 핸들러 생성한 뒤
:
:
: IOCPHandler:= TIOCPHandler.Create(nil, nil, 0, 0, nil);
: IOCPHandler.OnIOCompletion := IOCompletion
:
:
:
: DB저장하는 코드는 TMyWorkObj 를 상속받아 Execute 에 넣어두시고
:
:
: TMyDBWork = class(TMyWorkObj)
: constructor Create(... 필요한 파라미터 받아서 적당히 담아두셈~ )
: procedure Execute; override;
: end;
:
: ...
:
: procedure TMyDBWork.Execute;
: begin
: // 시간 많이 잡아먹는 DB저장코드 실행
: end;
:
:
:
: 저장해야할 상황에서 다음과 같이 저장 객체를 생성해 IOCPHandler 에 던지시면 됩니다.
:
:
: var
: MyDBWork: TMyDBWork;
: ...
:
: MyDBWork := TMyDBWork.Create(...이런저런 파라미터...);
:
: ....
: IOCPHandler.PostCompletionStatus(DWORD(MyDBWork), 0, @MyDBWork.OL, nil);
:
:
:
: CreateThread(), 또는 TThread 를 사용하는것과 IOCP 쓰레드풀 사용의 장단점은
: 구글에서 "이기탁" 님의 강좌를 찾아 읽어보시면 도움이 되실거에요.
:
:
:
: 서기 님이 쓰신 글 :
: : 제가 RS232 통신을 제어 하다가 이해되지 않는 부분이 생겨서 질문을 드리려고 합니다.
: :
: : 통신제어 프로그램은 델파이2010 에서 개발을 했습니다.232통신은 ComPort(4.0버전)를 사용하고요.
: : 프로그램이 하는 일은 약 1,000건의 데이타가 여러번에 걸쳐 나누어 전송이 되면 그 데이타를 받아서 화면에 아이콘 등을 변경시켜주고 나서 디비에 기록을 합니다. 그런데 동일한 프로그램을 윈도우XP(PC1)에서 실행 시키면 약 10초 내로 232통신을 처리 하는데 윈도우7(PC2)에서 실행 시키면 30~40초 정도로 처리 시간이 늘어지는 현상이 생깁니다.
: :
: : 혹시 디비에 데이타를 기록하는 데 걸리는 시간 문제인 듯 하여 윈도우7에서 화면 처리만 하고 디비 테이블에 인써트 하는 부분을 처리 하지 않게 해서 프로그램 테스트를 해보니 XP에서의 처리속도(화면처리,인써트처리를 전부 포함하는 속도)와 비슷합니다. 디비의 문제 일까요?
: :
: : 데이타베이스는 인터베이스-버전1.0.0.326-2000년쯤 배포된 버전. WIndowsNT 6.1(Build7600)-입니다.
: : OS가 윈도우XP에서 윈도우7으로 변경 되면서 인터베이스를 로컬서버로 설정을 하면 제가 만든 프로그램에서는 접속 에러가 나더군요. 그래서 리모트서버로 설정을 바꾸고 개발을 진행해 왔는데 이것이 영향을 끼칠 수도있을 것 같구요. 혹시 같은 경험을 하시거나 이 조합으로 개발을 하신분이 계시다면 도움 좀 부탁드립니다.
: :
: : 제가 테스트를 하면서 이 문제를 해결하기 위한 방법을
: :
: : 1.ComPort를 업그레이드 한다.(통신 속도가 문제라면)
: : 2.디비를 업그레이드 한다.(디비에 기록하는 시간이 문제라면)
: : 3.윈도우7의 에어로 옵션등을 변경해서 화면처리를 빠르게 해준다.
: : 4.232통신 처리 부분과 디비에 기록하는 처리 부분의 로직을 변경 한다.
: :
: : 네 가지 정도로 생각해 보았는데요. 3번은 테스트 해보니 여전히 처리 속도가 느립니다.
: :
: : 혹시 제가 놓친 부분이 있다면 무엇인지 조언을 부탁 드립니다.