자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey DataSNAP 연결하여 클라이언트에서 업무처리중에 네트웍이 끊기면
2017.07.16 20:22
procedure THeaderFooterwithNavigation.FormShow(Sender: TObject);
var n1 : integer;
mess : string;
begin
try
SQLConnection1.Connected := True;
method := TServerMethods1Client.Create( SQLConnection1.DBXConnection );
mess := '';
except
on E: Exception do begin
mess := E.Message;
LabelCount.Text := mess;
end;
end;
if mess <> '' then begin
MessageDlg('서버연결 실패', System.UITypes.TMsgDlgType.mtInformation,
[ System.UITypes.TMsgDlgBtn.mbOk ], 0,
procedure(const AResult: TModalResult)
begin
case AResult of
{ Detectwhichbuttonwaspushedand show a differentmessage }
mrYes: begin
// pressed yes
end;
mrNo: begin
// pressed no
end;
end;
end
);
// Application.Terminate;
end;
......
안녕하세요!!
안드로이드에서 위와 같은 코드를 실행하면
평상시는 정상적으로 동작하는데
와이파이 신호가 약해지거나 인터넷이 끊기면
어플이 멈춥니다.
서버는 DataSNAP으로 구현하였고
클라이언트에서 SQLConnection으로 연결해서
서버의 메서드를 호출하는 방식으로 MYSQL의 데이터를 불러오고 저장하는 방식을
사용하였습니다.
인터넷 상태가 끊겼을때 어플이 멈추지 않도록
예외처리를 하는 방법이 있을까요?
감사합니다~~~
댓글 2
-
험프리
2017.07.17 11:01
-
0Erros
2017.07.17 16:20
앗~~~~ 감사합니다.
덕분에 해결되었습니다.
참고로 코드는 아래와 같습니다.
procedure THeaderFooterwithNavigation.runTThread();
var statMess : string;
begin
tthreadTerm := False;
TThread.CreateAnonymousThread(
procedure
begin
while true do begin
Sleep(10);
SQLConnection1.Connected := True;
if sqlconnection1.ConnectionState = csStateClosed then statMess := 'Closed' else
if sqlconnection1.ConnectionState = csStateOpen then statMess := 'Open' else
if sqlconnection1.ConnectionState = csStateConnecting then statMess := 'Connecting' else
if sqlconnection1.ConnectionState = csStateExecuting then statMess := 'Executing' else
if sqlconnection1.ConnectionState = csStateFetching then statMess := 'Fetching' else
if sqlconnection1.ConnectionState = csStateDisconnecting then statMess := 'Disconnection' else
statMess := 'etc';
TThread.Queue( nil,
procedure
begin
LabelCount.Text := FormatDateTime('YYYY.MM.DD HH:MM:SS',Now)+ ' '+statMess;
end
); // tthread
if statMess <> 'Open' then Continue;
if tthreadTerm then break;
method := TServerMethods1Client.Create( SQLConnection1.DBXConnection );
method.GetTableFromSelect( varSeq, varDID, varGate, varDim, varWatt, varDate, varMessage );
method.FreeInstance;
SQLConnection1.Connected := False;
if ( varMessage = '' ) and ( varSeq <> befSeq ) then begin
TThread.Queue( nil,
procedure
begin
setArrData();
end
); // tthread
end;
befSeq := varSeq;
end; // while
end
).Start;
end;
Firemonkey DataSNAP 연결하여 클라이언트에서 업무처리중에 네트웍이 끊기면
2017.07.16 20:22
procedure THeaderFooterwithNavigation.FormShow(Sender: TObject);
var n1 : integer;
mess : string;
begin
try
SQLConnection1.Connected := True;
method := TServerMethods1Client.Create( SQLConnection1.DBXConnection );
mess := '';
except
on E: Exception do begin
mess := E.Message;
except
on E: Exception do begin
mess := E.Message;
LabelCount.Text := mess;
end;
end;
end;
end;
if mess <> '' then begin
MessageDlg('서버연결 실패', System.UITypes.TMsgDlgType.mtInformation,
[ System.UITypes.TMsgDlgBtn.mbOk ], 0,
procedure(const AResult: TModalResult)
begin
case AResult of
{ Detectwhichbuttonwaspushedand show a differentmessage }
mrYes: begin
// pressed yes
end;
mrNo: begin
// pressed no
end;
end;
end
);
MessageDlg('서버연결 실패', System.UITypes.TMsgDlgType.mtInformation,
[ System.UITypes.TMsgDlgBtn.mbOk ], 0,
procedure(const AResult: TModalResult)
begin
case AResult of
{ Detectwhichbuttonwaspushedand show a differentmessage }
mrYes: begin
// pressed yes
end;
mrNo: begin
// pressed no
end;
end;
end
);
// Application.Terminate;
end;
end;
......
안녕하세요!!
안드로이드에서 위와 같은 코드를 실행하면
평상시는 정상적으로 동작하는데
와이파이 신호가 약해지거나 인터넷이 끊기면
어플이 멈춥니다.
서버는 DataSNAP으로 구현하였고
클라이언트에서 SQLConnection으로 연결해서
서버의 메서드를 호출하는 방식으로 MYSQL의 데이터를 불러오고 저장하는 방식을
사용하였습니다.
인터넷 상태가 끊겼을때 어플이 멈추지 않도록
예외처리를 하는 방법이 있을까요?
감사합니다~~~
댓글 2
-
험프리
2017.07.17 11:01
-
0Erros
2017.07.17 16:20
앗~~~~ 감사합니다.덕분에 해결되었습니다.참고로 코드는 아래와 같습니다.procedure THeaderFooterwithNavigation.runTThread();
var statMess : string;begintthreadTerm := False;TThread.CreateAnonymousThread(
procedure
begin
while true do begin
Sleep(10);SQLConnection1.Connected := True;if sqlconnection1.ConnectionState = csStateClosed then statMess := 'Closed' else
if sqlconnection1.ConnectionState = csStateOpen then statMess := 'Open' else
if sqlconnection1.ConnectionState = csStateConnecting then statMess := 'Connecting' else
if sqlconnection1.ConnectionState = csStateExecuting then statMess := 'Executing' else
if sqlconnection1.ConnectionState = csStateFetching then statMess := 'Fetching' else
if sqlconnection1.ConnectionState = csStateDisconnecting then statMess := 'Disconnection' else
statMess := 'etc';
TThread.Queue( nil,
procedure
begin
LabelCount.Text := FormatDateTime('YYYY.MM.DD HH:MM:SS',Now)+ ' '+statMess;
end
); // tthreadif statMess <> 'Open' then Continue;if tthreadTerm then break;method := TServerMethods1Client.Create( SQLConnection1.DBXConnection );
method.GetTableFromSelect( varSeq, varDID, varGate, varDim, varWatt, varDate, varMessage );
method.FreeInstance;SQLConnection1.Connected := False;if ( varMessage = '' ) and ( varSeq <> befSeq ) then begin
TThread.Queue( nil,
procedure
begin
setArrData();
end
); // tthread
end;befSeq := varSeq;
end; // while
end
).Start;
end;
모바일 환경과 같이 서버와 연결이 빈번하게 끊어지는 환경이라면, 서버와 연결을 유지하지 않도록 구성하는 것이 좋습니다.
즉, 서버 측의 데이터가 필요한 경우 연결 후 데이터 송/수신 후 연결해제 하도록 구현하면 좋습니다.
위 코드에서는 다음과 같이 데이터 처리 후 연결을 끊도록 조치해보시기 바랍니다.
try
SQLConnection1.Connected := True;
method := TServerMethods1Client.Create( SQLConnection1.DBXConnection );
mess := '';
SQLConnection1.Connected := False;
except
on E: Exception do begin
mess := E.Message;
LabelCount.Text := mess;
end;
end;