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