Q&A

  • TClientSocket 에 Thread 적용시..
안녕하세요..델초보입니다.

다름이 아니라 ClientSocket을 이용해 서버와 통신하는 프로그램을 짜고있습니다. 근데 한 클라언트에서 여러 서버에 접속하기위해서 소켓을 등록된 서버만큼 생성하여 각 서버로 접속 시키려 합니다..

거기에 앞서 Thread를 테스트하려고 ClientSocket을 가지고 테스트하고 있는데 잘 값이 안나옵니다.

아래는 테스트 하던 소스 입니다.

쓰레드를 적용안시키고 서버에 접속을 시도하면 어찌하던 값은 넘어옵니다.

근데 쓰레드를 적용시켜 테스트를 하면 connecting 까지만 가고 반응이 없습니다.

아래 소스를 보시고 잘못된 부분을 지적 해주시기 바랍니다..ㅜ.ㅜ

TMyThread = class(TThread)
  private
  protected
    procedure Execute; override;
end;

var
  Form1: TForm1;

  cSocket : TClientSocket;

  isFirstPacket : Boolean;
  hasSize : Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyThread : TMyThread;
begin
  MyThread := TMyThread.Create(false);

{
  cSocket := TClientSocket.Create(nil);
  cSocket.OnConnect := Form1.cSocketConnect;
  cSocket.OnConnecting := Form1.cSocketConnecting;
  cSocket.OnDisconnect := Form1.cSocketDisconnect;
  cSocket.OnError := Form1.cSocketError;
  cSocket.OnRead := Form1.cSocketRead;

  cSocket.Address := '192.168.0.83';
  cSocket.Port := 3688;
  cSocket.Active := True;
}

end;

procedure TMyThread.Execute;       ==> 여기다 아래처럼 쓰면 안되나요?
begin
  FreeOnTerminate := True;

  cSocket := TClientSocket.Create(nil);
  cSocket.OnConnect := Form1.cSocketConnect;
  cSocket.OnConnecting := Form1.cSocketConnecting;
  cSocket.OnDisconnect := Form1.cSocketDisconnect;
  cSocket.OnError := Form1.cSocketError;
  cSocket.OnRead := Form1.cSocketRead;

  cSocket.Address := '192.168.0.83';
  cSocket.Port := 3688;
  cSocket.Active := True;

  Application.ProcessMessages;

end;

procedure TForm1.cSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  command : Byte;
begin
    Memo1.Lines.Add('연결2');
    command := 62;
    isFirstPacket := True;
    Socket.Lock;
    Socket.SendBuf(command, 1);
    Socket.Unlock;
end;

procedure TForm1.cSocketConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('연결1');
end;

procedure TForm1.cSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
  size : Integer;
begin
  Memo1.Lines.Add('기록');

  size := Socket.ReceiveLength;

  Memo1.Lines.Add(IntToStr(size));
end;
2  COMMENTS
  • Profile
    최용일 2004.11.06 04:29
    안녕하세요. 최용일입니다.

    대부분의 VCL컴포넌트들이 쓰레드안에서 안전하지 않습니다.

    Synchronize메소드를 이용해서 VCL 쓰레드 안에서 실행되도록 만들어보세요.

    예제는 델파이 헬프보시면 있습니다.

    ^^ 항상 즐코하세요...

  • Profile
    권경혁 2004.11.11 05:18
    쏘스를 보니 Execute 에 Loop 가 없네요....
    델파이 쓰레드를 아래와 같이 사용하시려면 Execute 에 Loop (while, Loop ) 문을 사용하여 이벤트를 기다려줘야 합니다. 그게 없으면 그냥 흘러 버리고 쓰레드가 종료 됩니다. 그리고 쓰레드안에서 VCL 컴포넌트 문제 없던데...