Q&A

  • 비동기적 메시지를 처리하는 핸들러 기다리기!
클라이언트 소켓에서 OnDisconnect라는 이벤트가 비동기적으로 발생하게 되는데

이것을 기다리고 있다가 그 이벤트 발생후에 어떤 특정 처리를 할 수 있는 방법이 있나요?



혹시나 ClientSocket1->OnDisconnect = [특정 함수 포인터] 식으로 해서 처리하라는 말씀은 마세요~

위에서 지정한 이벤트 핸들러는 비동기식으로 특정 인터럽트 혹은 스레드 혹은 뭔가 처리하는 데몬이 분명히 따로 돌고 있기 때문에 다른 함수에서 그것이 발생했는지 알수가 없잖습니까?



예를 들어 버튼클릭후 ClientSocket1->Open() 시키면 그때부터의 모든 소켓에 대한 처리는 버튼 클리 관련 이벤트 핸들러와는 전연 관계없이 따로 수행되는 것으로 압니다.

그러나 버튼 클릭 이벤트에서 소켓 처리 다 끝나고 발생되는 OnDisconnect 이벤트 발생을 감지할 때까지 기다렸다가 나머지 처리를 하려고 하는데 따로 수행되는 disconnect 이벤트와 버튼 클릭 이벤트가 어떻게 서로를 감지 할 수 있을지...



헐..

도와주셈~~~~~

1  COMMENTS
  • Profile
    토맛토 2001.06.17 00:00
    버튼을 누르고 나면 소켓이열리고 처리하고 소켓이 닫힐 때 까지 버튼 클릭이벤트가 끝나지 않고 기다렸다가 다음 처리를 해야한다는 말씀이신가요?

    그러다면 다음과 같이 코드를 작성하시면 될듯...





    procedure TForm1.Button1Click(Sender: TObject);

    begin



    // 접속전 상태

    ExitCode := 0;



    // 접속시도

    ClientSocket1.Active := true;





    // 접속이 되면 ExitCode := 1,

    // 접속이 끊어질 때 ExitCode := 2

    // 접속이 안될때의 오류가 발생하면 ExitCode := 3





    // 접속이 되던지 안될때 까지 기다린다.

    while ExitCode = 0 do

    Application.ProcessMessages;





    if ExitCode = 1 then begin

    showMessage('소켓접속성공');





    // 데이터 주고 받는 처리





    // 소켓닫기

    ClientSocket1.Close;







    end else if ExitCode = 3 then

    showMessage('접속오류');







    end;



    procedure TForm1.ClientSocket1Connect(Sender: TObject;

    Socket: TCustomWinSocket);

    begin

    ExitCode := 1; // 접속성공

    end;



    procedure TForm1.ClientSocket1Disconnect(Sender: TObject;

    Socket: TCustomWinSocket);

    begin

    ExitCode := 2; // 접속종료

    end;



    procedure TForm1.ClientSocket1Error(Sender: TObject;

    Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;

    var ErrorCode: Integer);

    begin

    ExitCode := 3; // 오류

    ErrorCode := 0;

    end;









    곽경민 wrote:

    > 클라이언트 소켓에서 OnDisconnect라는 이벤트가 비동기적으로 발생하게 되는데

    > 이것을 기다리고 있다가 그 이벤트 발생후에 어떤 특정 처리를 할 수 있는 방법이 있나요?

    >

    > 혹시나 ClientSocket1->OnDisconnect = [특정 함수 포인터] 식으로 해서 처리하라는 말씀은 마세요~

    > 위에서 지정한 이벤트 핸들러는 비동기식으로 특정 인터럽트 혹은 스레드 혹은 뭔가 처리하는 데몬이 분명히 따로 돌고 있기 때문에 다른 함수에서 그것이 발생했는지 알수가 없잖습니까?

    >

    > 예를 들어 버튼클릭후 ClientSocket1->Open() 시키면 그때부터의 모든 소켓에 대한 처리는 버튼 클리 관련 이벤트 핸들러와는 전연 관계없이 따로 수행되는 것으로 압니다.

    > 그러나 버튼 클릭 이벤트에서 소켓 처리 다 끝나고 발생되는 OnDisconnect 이벤트 발생을 감지할 때까지 기다렸다가 나머지 처리를 하려고 하는데 따로 수행되는 disconnect 이벤트와 버튼 클릭 이벤트가 어떻게 서로를 감지 할 수 있을지...

    >

    > 헐..

    > 도와주셈~~~~~