주만호 님이 쓰신 글 :
: 도움말 님이 쓰신 글 :
: : 먼저 이 질문을 읽어 주시는 님께 감사드립니다.
: :
: : 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;
:
: 이런 방식으로 코딩하세요.
|