클라이언트 소켓에서 OnDisconnect라는 이벤트가 비동기적으로 발생하게 되는데
이것을 기다리고 있다가 그 이벤트 발생후에 어떤 특정 처리를 할 수 있는 방법이 있나요?
혹시나 ClientSocket1->OnDisconnect = [특정 함수 포인터] 식으로 해서 처리하라는 말씀은 마세요~
위에서 지정한 이벤트 핸들러는 비동기식으로 특정 인터럽트 혹은 스레드 혹은 뭔가 처리하는 데몬이 분명히 따로 돌고 있기 때문에 다른 함수에서 그것이 발생했는지 알수가 없잖습니까?
예를 들어 버튼클릭후 ClientSocket1->Open() 시키면 그때부터의 모든 소켓에 대한 처리는 버튼 클리 관련 이벤트 핸들러와는 전연 관계없이 따로 수행되는 것으로 압니다.
그러나 버튼 클릭 이벤트에서 소켓 처리 다 끝나고 발생되는 OnDisconnect 이벤트 발생을 감지할 때까지 기다렸다가 나머지 처리를 하려고 하는데 따로 수행되는 disconnect 이벤트와 버튼 클릭 이벤트가 어떻게 서로를 감지 할 수 있을지...
헐..
도와주셈~~~~~
그러다면 다음과 같이 코드를 작성하시면 될듯...
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 이벤트와 버튼 클릭 이벤트가 어떻게 서로를 감지 할 수 있을지...
>
> 헐..
> 도와주셈~~~~~