Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Claudio Neto

Executar rotina continuamente

Recommended Posts

Bom dia.

 

Preciso montar uma rotina que faça uma consulta em um banco, se houver alteração no banco, o programa deve executar uma ação.

Mas preciso que essa rotina fique funcionando o tempo todo. Tentei usar isso:

 

clock_t start, cur_time;
start_time = clock();

while(clock() - start_time) < 86400 * CLOCKS_PER_SEC){
  //rotina
}

Mas com isso, preciso sempre indicar o tempo que irá durar. No caso coloquei 86400 para durar um dia, mas o programa ficará rodando direto em um uma máquina que não há acesso constante, então não serve para mim algo que depois de um tempo irá parar.

Tenho como deixar algo infinito, e sem que gaste muito processador?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que você não faz o programa com a parte de verificação de alteração e deixa o timer p/ o sistema operacional? Coloca na cron ou agende uma tarefa no windows.

P/ ver as infos da base selecionada você pode executar SHOW TABLE STATUS; e fazer o parsing do retorno.

Ao invés de usar polling o melhor seria fazer o inverso: fazer com que o processo do banco de dados chamasse o programa em C após atualizar a tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fazer com que o processo do banco de dados chamasse o programa em C após atualizar a tabela.

 

Isso aqui eu não conheço Isis. Nunca nem ouvi falar. Como seria exatamente? Eu crio o método no bd? Independente de qual bd seja, dá para fazer isso? Sabe onde acho a respeito?

 

Obrigado.

 

 

Quanto a tarefas agendadas, dei uma olhada, mas o menor período que oferece é um dia. Sua sugestão seria deixar aquele "cronômetro" de um dia e sempre abrir o programa a cada dia? Se não conseguir da outra maneira parece interessante tbm...

Compartilhar este post


Link para o post
Compartilhar em outros sites

É uma aplicação que faz o meio entre o usuário e o banco,certo? Nela tem update table?

Se for isso, após os update table você chama o programa criado separadamente (isso vai precisar de comunicação inter-processos) ou cria uma função.

 

Se não for isso, você pode usar os UDFs: http://www.mysqludf.org/lib_mysqludf_sys/index.php

 

 

sys_exec

sys_exec takes one command string argument and executes it.

 

 

Syntax

sys_exec(arg1)

Parameters and Return Values

arg1 A command string valid for the current operating system or execution environment. returns An (integer) exit code returned by the executed process.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O programa que preciso que fique executando irá realizar uma ligação com os dados que forem colocados no banco. Os dados serão colocados no banco através de uma aplicação web.

O programa fará a ligação. Caso seja executada com sucesso, marca no banco status ok, senão, marca que tem que tentar de novo. E se for executar o programa sempre via a aplicação web, ele não conseguiria pegar essas que tem que tentar de novo.

 

Dei uma olhada no link também, e to achando que a melhor solução para meu problema será realmente executar um loop durante todo um dia e ativar o agendador de tarefas como indicou.

 

Estou rodando o programa desde 13:34 até agora (com uma rotina simples) para ver como o processamento se comporta e não está alto. Ele só está lendo um arquivo texto e escrevendo o conteúdo na tela, talvez quando se conectar com o bd isso piore um pouco, mas acho que vale a pena.

 

Se ainda achar uma solução melhor pra mim agradeço, mas pelo visto é isso mesmo que tenho que manter né...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aplicação web escrita em quê? Java? PHP? Ruby? Python?

Se uma outra linguagem insere os dados no banco, provavelmente também faz o update. É só chamar o programa em C quando fizer o update.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não Isis, eu entendi o que você quis dizer.

 

O problema é que alguns updates serão executados pelo próprio programa, e não pela aplicação web.

 

Será assim. Na aplicação web (feita em ASP) eu insiro um novo valor no banco.

O programa deve ler essa nova informação, cujo status estará acusando que ainda não tentou ligar nenhuma vez.

Então ele pegará as informações necessárias e tentará ligar. Caso a pessoa atenda a ligação e ouça a mensagem que tem que ouvir, o programa atualiza o banco para status ok. Caso não atenda, o status será alterado para o correspondente, e deverá tentar ligar de novo depois de x minutos. Nesses x minutos depois, a aplicação web não tem envolvimento, então como faria para tentar ligar novamente? Não posso mandar o programa abrir ele mesmo depois de x minutos, e se o deixar aberto corro o risco de alguém fazer um novo insert via web e tentar abrir duas vezes a mesma aplicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode 'pausar' a execução do programa com a função 'sleep'

Ou então você faz três programas diferentes:

--> A aplicação web que insere os dados no BD

--> Uma aplicação que faz ligações

--> Uma aplicação que varre o banco de dados de x em x minutos e executa a aplicação que faz ligações

(por meio de um processo filho, para não parar a pesquisa), e checa o resultado da aplicação que faz ligações, se a ligação foi bem sucedida, altera o registro do banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas como eu faço essa aplicação que varre o banco de x em x minutos.

Se conseguir fazer minha aplicação fazer isso, nem preciso criar uma para varrer o banco e outra para discar, posso fazer com que a mesma faça as duas tarefas. Só que minha dificuldade é justamente essa, executar uma rotina temporariamente, sem término.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá difícil...

 

 

1- Crontab

 

2- Pool de Threads (acho mais fácil de sincronizar que usar processos separados)

* Inicia num loop while

* Inicia a thread que varre o banco e armazena os dados numa lista (somente quando a lista estiver vazia)

* Esgota o pool de threads e retira os dados da lista à medida que forem visitados (mesmo que não tenha escutado a mensagem)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Analisando o que o Victor disse, estou pensando em fazer dois aplicativos mesmo, um para analisar o banco e outro pra discar.

O para analisar o banco, farei em VB, que tenho mais facilidade e consigo todos os recursos que preciso. Só que para isso preciso saber uma coisa, tem como eu chamar o o aplicativo em C++ passando um valor, por exemplo usando o executar do windows dessa forma c:\programa.exe "1122220000"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.