ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

App travando quando o sinal wifi esta baixo

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Mobile com Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
eduardoserrao
Novato
Novato


Registrado: Segunda-Feira, 28 de Novembro de 2016
Mensagens: 78

MensagemEnviada: Sex Abr 12, 2019 10:32 am    Assunto: App travando quando o sinal wifi esta baixo Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Abr 12, 2019 8:36 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Mobile com Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB