안녕하세요..델초보입니다.
다름이 아니라 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;
대부분의 VCL컴포넌트들이 쓰레드안에서 안전하지 않습니다.
Synchronize메소드를 이용해서 VCL 쓰레드 안에서 실행되도록 만들어보세요.
예제는 델파이 헬프보시면 있습니다.
^^ 항상 즐코하세요...