 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
eduardoserrao Novato


Registrado: Segunda-Feira, 28 de Novembro de 2016 Mensagens: 78
|
Enviada: Sex Abr 12, 2019 10:32 am Assunto: App travando quando o sinal wifi esta baixo |
|
|
Bom dia pessoal
possuo uma aplicação datasnap (TSQLConnection) que esta travando quando o sinal do wifi esta baixo.
Eu queria que tentasse conectar com o servidor por apenas 5 seg, se não conseguisse desconectava. tentei usar as propridades communicationTimeout = 5000 e conectTimeout = 3000, mas a aplicação fica como se tivesse trancada, então criei um metodo para tentar fazer isso, mas também fica da mesma forma. Alguém saberia como posso fazer isso?
Código: | function TDM.isTemComunicacao: Boolean;
var
thread : TConexaoThread;
begin
CM.qryConfig.Close();
CM.qryConfig.Open();
thread := TConexaoThread.Create(False, CM.qryConfigIP_SERVIDOR.AsString, conexao.Params.Values['Port']);
thread.WaitFor;
FreeAndNil(thread);
if isConectado then begin
try
fecharConexao;
conexao.Open;
Result := True;
except
on E : Exception do begin
gerarLog('Erro ao conectar com o servidor: ' +E.ClassName + ': ' + E.Message);
fecharConexao;
Result := False;
end;
end;
end else begin
Result := False;
end;
end; |
metodo execute da minha thread:
Código: | procedure TConexaoThread.Execute;
var
TCPClient : TIdTCPClient;
begin
inherited;
DM.isConectado := False;
try
TCPClient := TIdTCPClient.Create(nil);
try
TCPClient.Host := IP;
TCPClient.Port := StrToInt(Porta);
TCPClient.ConnectTimeout := 5000;
TCPClient.Connect;
DM.isConectado := True;
except
DM.isConectado := False;
end;
finally
FreeAndNil(TCPClient);
end;
end; |
Obs: com sinal forte funciona perfeitamente. |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Sex Abr 12, 2019 8:36 pm Assunto: |
|
|
Código: | function TDM.isTemComunicacao: Boolean;
var
thread : TConexaoThread;
begin
CM.qryConfig.Close();
CM.qryConfig.Open();
thread := TConexaoThread.Create(False, CM.qryConfigIP_SERVIDOR.AsString, conexao.Params.Values['Port']);
thread.WaitFor; // seu problema estar aqui
FreeAndNil(thread);
if isConectado then begin
try
fecharConexao;
conexao.Open;
Result := True;
except
on E : Exception do begin
gerarLog('Erro ao conectar com o servidor: ' +E.ClassName + ': ' + E.Message);
fecharConexao;
Result := False;
end;
end;
end else begin
Result := False;
end;
end; |
o comando thread.WaitFor vai colocar a thrad antecessor em modo a aguardar a TConexaoThread terminar seu processo, ou seja se não houver nenhuma thread acima que não seja a thread principal então será a thread principal a ser colocada em estado de aguarde.
seu exemplo em resumo:
Código: | thread principal (programa em si roda em um thread pai)
begin
thread := TConexaoThread.Create(False, CM.qryConfigIP_SERVIDOR.AsString, conexao.Params.Values['Port']);
thread.WaitFor; // aqui a thread do programa principal vai ficar aguardando thread TConexaoThread terminar
end; |
Modo a não deixar a thread principal aguardando seria colocar a criação da TConexaoThread dentro de uma outro recurso como:
outra Tthread, Ttask, TFuture entre outros similar.
é notavel que seu metodo isTemComunicacao espere um retorno boolean logo isso depende muito do quanto precisa deste retorno e em que momento nescessita dele.
Tipo se o metodo isTemComunicacao precisa retornar de imediato seu retorno e ainda não dá o aspecto de aplicação travou precisa trabalhar com alguma janela de informação do tipo "conectando favor aguarde...", contudo se este valor de retorno pode ser utilizado posteriomente a o momento em que o metodo isTemComunicacao tenha sido invocado então pode trabalhar com o TFuture que permite que seu valor de retorno suga mais tarde sem que a aplicação fique aguardando seu retorno, claro que neste caso precisa tratar o retorno do seu metodo sTemComunicacao assim que o mesmo surja.
recentimente passei por situação similar e precisei buscar algumas informações sobre tthread e achei um link bem bacana:
http://edgarpavao.com/2017/08/07/multithreading-e-processamento-paralelo-no-delphi-ppl/
recomendo fortimente a leitura por completo este material.
boa sorte. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|