쓰레드에서 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개를 수정하면 될것 같은데요 아래처럼...
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 놈의 도움말을 잘 한번 읽어보시기를 ~~
제가 볼땐 저렇게 수정하면 무난히 돌아갈것으로 생각되네요 ( 저도 허접이라 )
그럼 즐거운 코딩하세요 ^^