Q&A

  • Socket관련 (강제종료?) 질문드립니다.
서버와 통신하는 중에는 OnCloseQuery 이벤트가 와도 먹통(프리징?)현상이 나타나고 있습니다.
ClientSocket의 OnConnect 의 연산이 끝나야 정상 종료 되는데요..
중간에 종료할 수 있는 방법이 있을까요?

고수님들의 도움 부탁드립니다.

테스트소스 첨부합니다.
3  COMMENTS
  • Profile
    홍성락 2009.01.09 00:15
    OnCloseQuery 이벤트가 왔다면, ClientSocket의 OnConnect중간에 Forms.Application.ProcessMessages;를 사용하셨다는거겠죠.
    Forms.Application.ProcessMessages;를 잘 사용하면 정지 시킬 수 있습니다.
    <!--CodeS-->
    //ClientSocket의 OnConnect 예입니다
    procedure TForm1.CS1Connect(Sender: TObject; Socket: TCustomWinSocket);
    var
    startx : string;
    begin
    while true do begin //-무한으로 돌고 있다고 가정합니다
    Forms.Application.ProcessMessages; //1.일단 Messages가 가능하도록 합니다
    if CS1.Active then begin //2. ClientSocket이 활성화인지 체크합니다
    Readln(fh, startx); //-파일 냐용을 계속 읽어 보낸다고 가정합니다
    if startx <> '' then begin
    CS1.Socket.SendText(startx);
    end
    else Reset(fh); //-파일을 또 첫줄부터 돌립니다
    end
    else exit; //3. ClientSocket이 활성화가 아니면 나갑니다
    end;
    end;

    //폼 닫기나 버튼이나 등등의 이벤트에서 ClientSocket를 닫습니다.
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    CS1.Active := False;
    end;




    <!--CodeE-->
  • Profile
    홍성락 2009.01.09 00:24
    앗! 첨부 파일이 있었네요
    Application.ProcessMessages 이후에 아무처리도 없네요....
    전역변수등으로 계속 실행할지 중단해야 할지를 구분 해주는 것이 필요합니다.
    일단, ClientSocket.Active만 체크해 보았습니다.


    procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
    var
    S : Integer;
    begin
    Memo1.Lines.Add('Client Msg : [ Server Conn ]');
    for S := 0 to 100 do begin
    Application.ProcessMessages;
    if ClientSocket.Active then begin //추가
    Socket.SendText('Send Msg : ['+IntToStr(S)+']');
    Sleep(100);
    end
    else exit; //추가
    end;
    end;


    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ClientSocket.Active := False;
    end;
  • Profile
    머문자리 2009.01.13 00:28
    답변이 늦어 죄송합니다. 홍성락님 덕분에 많은 도움이 되었습니다.