Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[15400] Re:Re:윈도우7에서 RS232통신문제(디비포함)
서기 [] 2246 읽음    2015-01-26 08:55
오랑캐꽃님 답변 잘 보았습니다. 몇 일간 홈피에 접속이 되지 않아 답글을 달지 못했습니다. 쓰레드 처리가 답인 것 같군요. 델마당에
서 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번은 테스트 해보니 여전히 처리 속도가 느립니다.
: :
: : 혹시 제가 놓친 부분이 있다면 무엇인지 조언을 부탁 드립니다.

+ -

관련 글 리스트
15397 윈도우7에서 RS232통신문제(디비포함) 서기 2650 2015/01/22
15398     Re:윈도우7에서 RS232통신문제(디비포함) 오랑캐꽃 2468 2015/01/22
15400         Re:Re:윈도우7에서 RS232통신문제(디비포함) 서기 2246 2015/01/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.