Ir para conteúdo
  • Cadastre-se

dev botao

Detectar carregamento de IP


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 2937 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Olá a todos,

Estou tendo um problema que está se tornando chato.

Tenho um aplicativo de ponto de venda que usa o MySQL como base de dados e eu coloco ele para inicializar com o windows.

O problema é que mais ou menos, 1 a cada 10 máquinas ao inicializar o windows demora alguns segundos para carregar o ícone da rede, mesmo estando com o IP fixo. E enquanto a rede não carrega, não é possível se conectar ao MySQL (mesmo estando na própria máquina) e recebo um erro. Isso ocorre mesmo se usar 127.0.0.1 ou localhost.

Preciso de alguma função que monitore a estabilização da rede para que eu conecte no MySQL somente quando estiver tudo ok. Alguém pode me ajudar nessa?

Desde já agradeço a atenção de todos

  • Membros Pro
Postado
3 horas atrás, Daniel Simoes disse:

Será que o problema não é o fato do MySQL demorar para "subir" ?

Ele está instalado como um serviço do Windows?

 

Olá Daniel, tudo bom?

Na verdade há tempos eu também achava que fosse o MySQL demorando assim como você, mas ontem eu presenciei em um cliente onde a demora era mais perceptível, com o ícone da rede "girando" como se buscasse um IP (apesar de fixo). É realmente devido a isso que ocorre o erro.

  • Fundadores
Postado

O Sistema operacional demora muito para deixar a rede pronta ?

Você poderia criar uma rotina de verificação da conexão do MySQL, tentando fazer um Ping no IP do Servidor, e aguardando alguns segundos no caso de falha... Algo como:

"Aguardado a carga do Servidor.. Pressione "ESC" para interromper"

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado (editado)

Olá Daniel,

Fiz a rotina conforme disse e parece que você estava certo. Mesmo aguardando o ping responder e conectando logo em seguida, o erro acontece, o que sugere ser o MySQL demorando a ficar ativo.

Estou pensando em colocar alguma função para verificar se o MySQL está ativo e só então conectar nele, o que acha?

Também pensei em outra solução que seria mais simples, só não sei se é possível. Quero fazer a seguinte estrutura abaixo:

Citar

try
    ZConnection1.Connected := True;
  except
    Volte no try acima e tente conectar novamente
  end;

É possível eu criar isso com o try/except???

Editado por doidopb
  • Membros Pro
Postado

Só a nível de esclarecimento, já tentei verificar se o processo está ativo através da função em http://showdelphi.com.br/dica-como-verificar-se-um-processo-esta-rodando-delphi/

Mas mesmo assim, 1 a cada 10 vezes ele dá o erro dizendo que não pode se conectar ao MySQL. Creio que ele visualiza o MySQL em memória, mas o mesmo não carregou por completo, gerando o erro.

O ideal seria realmente eu ficar tentado conectar o componente até ele conseguir, mas não sei como fazer isso através da exceção.

  • Membros Pro
Postado

Olá a todos,

Consegui fazer o loop que eu queria, segue código abaixo:

Citar

procedure ConectarMySQLLocal;
begin
  try
    ZConnection1.Connected := True;
  except
    Sleep(2000);
    ConectarMySQLLocal; //Aqui eu forco o programar a entrar nessa procedure novamente, criando o loop até conectar.
  end;
end;

Agora estou testando para ver se elimino realmente o problema que me fez abrir o tópico, mando notícias.

  • Curtir 1
  • Consultores
Postado
1 hora atrás, doidopb disse:

Olá a todos,

Consegui fazer o loop que eu queria, segue código abaixo:

Agora estou testando para ver se elimino realmente o problema que me fez abrir o tópico, mando notícias.

Tome apenas um cuidado para não gerar um StackOverflow com o código acima ou uma espera muito grande já que o usuário parece não ter a opção de cancelar o processo.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Fundadores
Postado

Cada método Chamado, insere um item novo, na "Pilha de comandos"... Com isso, o computador sabe para onde deve retornar, quando o método acabar...

Essa pilha de comandos, segue o modelo LIFO (Last In First Out)

O Stack Overflow, ocorrerá, quando você fizer muitas chamadas, que ficaram presas na pilha... (você atingiu o limite máximo de itens da pilha)

A maneira que você fez a sua rotina, usando uma chamada recursiva, poderá causar isso...

No Depurador da IDE, você pode ver a pilha de comandos usando Ctrl+Alt+S

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Membros Pro
Postado (editado)
2 horas atrás, Daniel Simoes disse:

Cada método Chamado, insere um item novo, na "Pilha de comandos"... Com isso, o computador sabe para onde deve retornar, quando o método acabar...

Essa pilha de comandos, segue o modelo LIFO (Last In First Out)

O Stack Overflow, ocorrerá, quando você fizer muitas chamadas, que ficaram presas na pilha... (você atingiu o limite máximo de itens da pilha)

A maneira que você fez a sua rotina, usando uma chamada recursiva, poderá causar isso...

No Depurador da IDE, você pode ver a pilha de comandos usando Ctrl+Alt+S

Legal, mas pelos testes que realizei aqui em alguns clientes com esse problema, só entrou no loop 1 vez, portanto acho que não chegará a dar esse erro.

Mas caso ele ocorra o aplicativo gerá um alerta para o cliente ou ao menos irá travar? Tentei o comando que me disse, mas só abriu a tela em anexo, uso o Delphi 2010.

 

imagem.JPG

Editado por doidopb
  • Membros Pro
Postado (editado)

Pessoal, a fim de evitar esse erro que o EMBarbosa citou, teriam uma outra sugestão de como programar essa tentativa persistente de conexão ao MySQL que funcione similar ao que eu fiz com o loop???

Editado por doidopb
  • Membros Pro
Postado
4 minutos atrás, Daniel Simoes disse:

Continue com o Loop, apenas não faça uma chamada recursiva...

Quando diz chamada recursiva, creio que está falando sobre chamar o procedimento dentro do procedimento. Certo???

Se sim, o loop que eu falei é exatamente isso, chamar o procedimento dentro do procedimento.

A procedure tenta dar o comando " ZConnection1.Connected := True; " e se não consegue, o componente gera uma exceção... Aí para que eu consiga dar novamente o comando " ZConnection1.Connected := True; " eu preciso chamar novamente a procedure, e em caso de erro o componente gera novamente a exceção chamando novamente a procedure e aí vai, até conseguir conectar.

Poderiam me dar uma dica de código onde eu consiga esse mesmo efeito sem o problema do StackOverFlow?

  • Fundadores
  • Solution
Postado
procedure ConectarMySQLLocal;
begin
  while not ZConnection1.Connected do
  begin
    try
      ZConnection1.Connected := True;
    except
      Sleep(2000);
    end;
  end;
end; 

 

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Este tópico foi criado há 2937 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.