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

카일릭스 Q&A
[74] Re:TIdTCPServer 에 대한 질문입니다.
주만호 [wbjsoft] 2603 읽음    2002-08-29 17:10
도움말 님이 쓰신 글 :
: 먼저 이 질문을 읽어 주시는 님께 감사드립니다.
:
: Kylix2로 클라이언트(약 50대)에서 한 라인의 메시지를 서버로 보내면
:
: 서버는 보내온 메시지를 그대로 리스트박스에 출력하는 프로그램을 테스트 하고 있습니다.
:
: 사용된 프로시져는 아래에 있는게 전부 입니다.
:
: 윈도우에 이 서버 프로그램을 설치해서 테스트하면 클라이언트에서 보내온 메시지를
:
: 지연시간없이 바로 리스트박스에 뿌려주던데 리눅스에 설치하고 테스트하니까
:
: 클라이언트에서 보내온 메시지가 엄청 늦게 보여집니다.
:
: 운영체제에 따른 차이가 있는지 아님 다른 문제인지
:
: 고수님들의 조언 부탁드립니다. 꼭이요..
:
:
: procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
: var
:     str: string;
: begin
:     with AThread.Connection do
:     begin
:         str := ReadLn;
:         if SameText(str, 'bye') then
:         begin
:             Disconnect;
:         end
:         else if str <> '' then
:         begin
:             ListBox1.Items.Add(str);
:         end
:     end;
: end;
:
: procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
: begin
:     AThread.Connection.WriteLn('하이!!');
: end;
:
: procedure TForm1.FormCreate(Sender: TObject);
: begin
:     IdTCPServer1.Active := true;
: end;

TIdTCPServer 의 OnExecute 이벤트는 어플리케이션의 메인 쓰레드가 아닌,
TIdTCPServer 에서 생성한 TIdPeerThread 에서 호출됩니다.

따라서 ListBox1 와 같은 전역 객체에 접근 할 때는 반드시 CriticalSection 같은

객체를 써서 동기화 해 주셔야 합니다.

물론 이 얘기는 윈도우에서도 마찬가지이지만, 특히 리눅스에서 더욱 엄격합니다.

CS : TCriticalSection; // uses 에 SyncObjs 를 추가하셔야합니다.

CS.Acquire;
try
  ListBox1.Items.Add(str);
finally
  CS.Leave;
end;

이런 방식으로 코딩하세요.

+ -

관련 글 리스트
74 Re:TIdTCPServer 에 대한 질문입니다. 주만호 2603 2002/08/29
75     Re:Re:답변 감사합니다..(내용無) 도움말 1976 2002/08/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.