Q&A

  • 멀티 스레드에서 개별 스레드 강제 종료에 관한 질문입니다.
먼저 다들 반갑구요 ,고생많으십니다.^^

전 웹 쪽 일을 하다가 얼마전에 델파이쪽 응용프로그램을 개발하기 시작한 초보 델파이어 입니다.

작은 회사라 이것 저것 다하게 되다보니 갑자기 네트
2  COMMENTS
  • Profile
    도화 2007.05.18 19:57
    여러가지 방법이 있겠습니다만...
    저는 Class를 이용한답니다.

    <!--CodeS-->
    // Class 선언부
      type TABC = class(TObject)
      private
        FIP: String;
        FThread: TIdPeerThread;
      public
        procedure DisConnect;
        property IP: String read FIP write FIP;
        property Thread: TIdPeerThread read FThread write FThread;
    // Class 선언부

    procedure TABC.Disconnect;
    begin
      FThread.Connection.Disconnect;
    end;

    <!--CodeE-->

    위와 같은 클래스를 TObjectList에 저장해 둔 다음
    IP로 검색해서 Disconnect Methode를 호출하면 될 듯 합니다.

    Private
      ABCList := TObjectList;  //선언 하시고

    FormCreate시
      ABCList := TObjectList.Create; //생성해 주시고

    FormDestroy시
      ABCList.Free; //파괴?해주시면 됩니다.

    클라이언트가 서버에 접속할 때 추가는
    IdTCPServer.OnConnect부분에서
    <!--CodeS-->
      ABC := TABC.Create;
      ABC.IP := AThread.IOHandler.Connection.PeerIP;  // <== 요부분 기억이 잘 안나네요
      ABC.Thread := AThread;
      ABCList.Add(ABC);
    <!--CodeE-->

    Disconnect는

    <!--CodeS-->
    procedure ServerFrm.DisconnectIP(const AIP: string);
    var
      i: Integer;
      ABC: TABC;
    begin
      for i := ABCList.Count - 1 downto 0 do
      begin
        ABC := TABC(ABCList.Items[i]);
        if ABC.IP = AIP then
        begin
           ABC.Disconnect;
           ABCList.Delete(i);
           Break;
        end;
      end;
    end;
    <!--CodeE-->

    기냥 테스트 안해보고 머리속에 있는데로 코딩한거라 에러나 오타가 있을수도...


  • Profile
    박민호 2007.05.19 02:56
    와 그렇군요, 스레드가 생성될때

    관리 하는 리스트를 생성해서 그 리스트를 골라 삭제하는!!!

    아 해결하는데 많은 도움이 될것같습니다. 정말 감사해요 정말정말정말 ㅜㅠ

    아 그리고 아이피나 포트 얻어오는 방법은

    쓰레드명.Connection.Socket.Binding.peerIP

    쓰레드명.Connection.Socket.Binding.peerPort

    이 같은 방법으로 알수가 있네요