Q&A

  • 쓰레드 소켓수신시 먹통!!
쓰레드에서 IndyUDPClient 소켓을 생성한 다음
브로드캐스팅 되고있는 데이타를 수신하여 처리하려 합니다.
테스트삼아 간단히 만들어보았는데
Receivestring 에서 먹통이 되네요.

Tcp 소켓으로 테스트해보면 서버에서 커넥트 떨어지는건 확인했는데
역시 Readln 문에서 멈춰버립니다.

왜 그럴까요.. -,.-

살펴보시고 답변 주시면 고맙겠습니다.

<!--CodeS-->
unit Unit2;

interface

uses
  Classes,IdUDPServer,Unit1,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdSocketHandle,
  IdTCPClient;

type
  mySocket = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure LabelWrite;
  end;

implementation
var
  mytt : TIdUDPClient;

procedure mySocket.Execute;
var
  s : String;

begin
  mytt := TIdUDPClient.Create(Form1);
  mytt.Port := 30018;

  Synchronize(LabelWrite);
end;

procedure mySocket.LabelWrite;
var
  s : string;
begin
  mytt.Active := true ;

  while Terminated = False do
  begin
    s := mytt.ReceiveString;//  ReadLn();
   Form1.Label2.Caption := s;
  end;
  mytt.Free;
end;
end.

<!--CodeE-->

일단, 안티프리즈 컴포넌트를 갖다놓으니 얼진 않는군요.
블록킹 때문이라 하더라도 쓰레드로 띄웠으니
쓰레드 유닛만 멈춰있어야 하는거 아닌가요?
왜 메인폼이 같이 멈춰버리는건지 ..
2  COMMENTS
  • Profile
    김영대 2006.07.25 04:49
    제가 델파이는 잘모르지만 코드가 좀 이상하군요
    프로시저 2개를 수정하면 될것 같은데요 아래처럼...


    procedure mySocket.Execute;
    var
      s : String;

    begin
      mytt := TIdUDPClient.Create(Form1);
      mytt.Port := 30018;
      mytt.Active := true ;

      while Terminated = False do
      begin
         s := mytt.ReceiveString;//  ReadLn();
         Synchronize(LabelWrite);
      end;
      mytt.Free;

    end;

    procedure mySocket.LabelWrite(var s: String);
    begin
           Form1.Label2.Caption := s;
    end;

    이렇게 해야 맞는것 같군요 ( 제가 델파이를 쓰지 않는관계로 테스트 못해봤습니다. ㅈㅅㅇ )

    Synchronize 이건 제가 볼땐 Code Lock 을 하는 프로시저인듯 한데
    저렇게 무한루프를 통째로 Code Lock  을 하는게 좀 문제가 있어보이구요
    Code Lock 은 데이타를 Update하는 부분만 하면 됩니다.

    Synchronize 놈의 도움말을 잘 한번 읽어보시기를 ~~

    제가 볼땐 저렇게 수정하면 무난히 돌아갈것으로 생각되네요 ( 저도 허접이라 )

    그럼 즐거운 코딩하세요 ^^


  • Profile
    정일준 2006.07.25 23:32

    감사합니다. ^^

    글쿤요. 코딩을 그렇게~

    일단은 여전히 수신이 안되길래 UDPserver 를 생성해서 receivestring 돌렸더니

    받아오네요. 용도가 제가 생각한거랑 틀린건지... 여전히 미궁입니다. ^^