안녕하세요...
소켓프로그램을 연습하고 있는데요...
서버소켓을 쓰레드 방식으로 했씁니다...
아래는 코딩이구요... 그냥 간단하게... 카운트 새는거 했는데...
쓰레드가 시작되면 카운트 하나 증가시키고 종료되면 카운트 하나 감소시키는 코딩인데...
클라이언트 소켓을 클로즈하거나 클라이언트가 접속을 끊으면 쓰레드가 종료되는줄 알았는데...
그게 아닌가 봅니다... ㅜㅜ ThreadEnd이벤트가 전혀 실행이 안되고요...
서버소켓프로그램을 닫으니까 그때 이벤트가 실행되더군요...
클라이언트가 접속을 끊으면 쓰레드를 해제하려면 어떻게 해야 할지...
만약 이상태라면... 쓰레드가 쌓이기만 할것 같아서요...^^
고수님들의 답변 기다리겠습니다...
행복하세요...
procedure TServerSocketForm.FormCreate(Sender: TObject);
begin
ServerSocket1.Open;
ThreadCount := 0;
end;
procedure TServerSocketForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ServerSocket1.Close;
end;
{ TMyServerThread }
procedure TServerSocketForm.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TMyServerThread.Create(False, ClientSocket);
end;
procedure TMyServerThread.ClientExecute;
var
Stream: TWinSocketStream;
iTimeOut: Integer;
InBuf, OutBuf: array [0..1024] of Char;
Buffer: String;
i: Integer;
begin
iTimeOut:=60000;
try
Stream := TWinSocketStream.Create(ClientSocket, iTimeOut);
Buffer:='';
while (not Terminated) and ClientSocket.Connected do
begin
FillChar(InBuf, 1024, #0);
FillChar(OutBuf, 1024, #0);
if not Stream.WaitForData(iTimeOut) then
begin
StrPCopy(OutBuf, 'TIMEOUT');
Stream.Write(OutBuf, StrLen(OutBuf));
//##########여기서 클라이언트 소켓을 닫았는데... 쓰레드는 안없어지네요...ㅜㅜ
ClientSocket.Close;
DecClientCount;
Break;
end;
end;
except
HandleException;
end;
Stream.Free;
end;
//############쓰레드가 종료되면 카운트 하나 감소#############
procedure TServerSocketForm.ServerSocket1ThreadEnd(Sender: TObject;
Thread: TServerClientThread);
begin
if ThreadCount > 0 then
Dec(ThreadCount);
end;
procedure TServerSocketForm.ServerSocket1ThreadStart(Sender: TObject;
Thread: TServerClientThread);
begin
Inc(ThreadCount);
end;
end.