Sponsor Posted June 21, 2012 at 03:28 PM Report Share #464625 Posted June 21, 2012 at 03:28 PM Boa tarde, Gostaria que me podessem dar a vossa opinião sobre a melhor forma de criar um programa que esteja sempre em execução e de x em x tempo verifique numa base de dados SQL se tem dados novos. Obrigado! Link to comment Share on other sites More sharing options...
bruno1234 Posted June 21, 2012 at 06:31 PM Report Share #464705 Posted June 21, 2012 at 06:31 PM Podes criar um executável e agendar no scheduler do windows o que precisares. Também podes criar um serviço windows, mas a primeira opção é mais simples porque o scheduler do windows já tem várias opções para configurar a execução do teu programa. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos Link to comment Share on other sites More sharing options...
Sponsor Posted June 22, 2012 at 08:00 AM Author Report Share #464844 Posted June 22, 2012 at 08:00 AM Podes criar um executável e agendar no scheduler do windows o que precisares. E algo que não precise que agedar nada no windows. Algo como iniciar o executavel (e como o pc estará sempre ligado, e ao reiniciar inicia o exe) e ser o próprio programa encarregue de x em x tempo executar as verificações? Obrigado! Link to comment Share on other sites More sharing options...
M6 Posted June 22, 2012 at 08:52 AM Report Share #464852 Posted June 22, 2012 at 08:52 AM Tens de criar um serviço e registá-lo no Windows. Assim, sempre que o sistema arrancar, o teu serviço arranca também. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to comment Share on other sites More sharing options...
bruno1234 Posted June 22, 2012 at 06:43 PM Report Share #465017 Posted June 22, 2012 at 06:43 PM E algo que não precise que agedar nada no windows. Algo como iniciar o executavel (e como o pc estará sempre ligado, e ao reiniciar inicia o exe) e ser o próprio programa encarregue de x em x tempo executar as verificações? Obrigado! Podes criar um executável (console application) e executá-lo. Para correr quando o pc reinicia colocas na pasta startup do menu iniciar. O único senão neste caso é que tens que ser tu a gerir por código as execuções de x em x tempo. Tens que te preocupar com: - Criar um Timer que está sempre a correr. - Prevenir o caso de não ser executado uma vez. O que fazer neste caso? - O processo demorou mais do que previsto? Executo outra vez? Espero algum tempo até voltar a executar? Não executo? - Se não executo quando volto a executar? - O que faço em caso de erro? Ignoro? Volto a correr de seguida? - Deve executar com permissões de administrador? - O utilizador tem que ter sessão iniciada para correr? - Se for portátil deve executar só com bateria? Deve executar se o pc não estiver idle? - Vale a pena correr se não houver ligação de rede? - Devo guardar um histórico de execuções? - Devo interromper a tarefa se demorar mais de x tempo? Se utilizares o scheduler do windows, isto tudo é de borla. Podes agendar e configurar pela 1ª vez e exportas a configuração (é um xml). Quando colocares noutro pc, importas a configuração. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos Link to comment Share on other sites More sharing options...
Knitter Posted June 23, 2012 at 05:45 PM Report Share #465139 Posted June 23, 2012 at 05:45 PM Como o M6 indicou, a melhor opção será implementares um serviço. Sendo .Net é algo bastante simples de implementar. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Sponsor Posted June 25, 2012 at 05:27 PM Author Report Share #465428 Posted June 25, 2012 at 05:27 PM Obrigado pelas respostas! bruno1234, o que eu tenho neste momento é isso mesmo um console application com um timer que de x em x tempo eexecuta o que quero. O que acontece é que ao fim de algum tempo deixa de executar. M6, Consigo mais tarde criar um pacote de instação, que permita instalar um programa e depois esse serviço?! o programa vai precisar desse serviço em funcionamento! Link to comment Share on other sites More sharing options...
Knitter Posted June 25, 2012 at 07:33 PM Report Share #465460 Posted June 25, 2012 at 07:33 PM Criar o pacote de instalação não será complicado. Tenho uma aplicação feita com a situação que descreves: Um serviço é executado a intervalos regulares e contém uma aplicação de monitorização, as duas são instaladas automaticamente por um installer InnoSetup. É o próprio serviço que contém métodos para se registar automaticamente no SCM do Windows e para remover o registo durante a desinstalação. Se não me esquecer coloco aqui o código exemplo. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Knitter Posted June 25, 2012 at 08:27 PM Report Share #465481 Posted June 25, 2012 at 08:27 PM Este é um exemplo da classe principal dos meus serviços que se "auto-instalam/removem". Quando a aplicação é executada em modo interactivo (consola/conta interactiva) é feita a adição ou remoção do serviço no SCM. Caso seja iniciada pelo SCM (modo não interactivo) então é instanciada a classe que implementa o serviço e este é iniciado. É depois a classe MyService que contém uma instância de System.Timers.Timer que fornece eventos a intervalos regulares. using System; using System.ServiceProcess; using System.Runtime.InteropServices; using System.Threading; namespace MyServiceNS { public static class MyServiceApp { [DllImport ("kernel32.dll")] public static extern Boolean AllocConsole (); public static void Main (String[] args) { if (System.Environment.UserInteractive) { switch (String.Concat (args)) { case "--install": //executado pelo script InnoSetup durante a instalação System.Configuration.Install.ManagedInstallerClass.InstallHelper (new String[] { System.Reflection.Assembly.GetExecutingAssembly ().Location }); break; case "--uninstall": //executado pelo script InnoSetup durante a desinstalação System.Configuration.Install.ManagedInstallerClass.InstallHelper (new String[] { "/u", System.Reflection.Assembly.GetExecutingAssembly ().Location }); break; } } else { ServiceBase.Run (new MyService ()); } } } } 1 Report www.sergiolopes.eu Link to comment Share on other sites More sharing options...
Sponsor Posted June 29, 2012 at 10:56 AM Author Report Share #466390 Posted June 29, 2012 at 10:56 AM Viva, knitter, mesmo usando o serviço tenho de ter em atenção os aspectos referidos pelo bruno1234, certo? Neste momento, ainda não estou a usar o console application que criei! Quando tiver mesmo que definir uma solução definitiva e se tiver dúvidas exponho-as aqui. Obrigado pela atenção! Link to comment Share on other sites More sharing options...
Knitter Posted June 29, 2012 at 12:14 PM Report Share #466416 Posted June 29, 2012 at 12:14 PM Um serviço é gerido pelo sistema operativo, uma tarefa agendada como o Bruno indicou é controlada pela aplicação de agendamento de tarefas, são formas diferentes e com vantagens/desvantagens diferentes. Pessoalmente não gosto do sistema de agendar tarefas do windows, tem demonstrado falhar mais do que é suposto. - Criar um Timer que está sempre a correr. Se for um serviço podes usar a classe Timer que indiquei e que é a recomendada para esta situação. - Prevenir o caso de não ser executado uma vez. O que fazer neste caso? Igual nos dois casos se não quiseres usar o comportamento por omissão. No caso dos serviços, a execução só falha se o código do serviço falhar (o teu código) ou se o computador estiver desligado, fora isso o serviço será sempre executado. - O processo demorou mais do que previsto? Executo outra vez? Espero algum tempo até voltar a executar? Não executo? Não faz muito sentido ter isto em conta, a não ser que estejas a executar uma tarefa onde exista um tempo limite. De qualquer modo é igual tanto num como no outro, se é um ponto a teres em conta tem de ser controlado pelo teu código, não interessa se é uma tarefa agendada ou um serviço. - Se não executo quando volto a executar? Outra coisa que não me parece fazer sentido. Se não executaste voltas a executar no próximo momento de acordo com o intervalo de repetição. Se não executaste porque o código tem erros não vais conseguir voltar a executar. Se não executaste porque o computador esteve desligado, no caso de um serviço, assim que o computador voltar a ser ligado o processo iniciará normalmente com a contagem do tempo. - O que faço em caso de erro? Ignoro? Volto a correr de seguida? Qual erro? Erros da tua aplicação terão de ser controlados sempre por ti. Tanto as tarefas agendadas como os serviços têm mecanismos de controlo no caso de erros. - Deve executar com permissões de administrador? O que é que isto tem a ver com ser tarefas, executáveis ou serviços? Se as funções que queres desempenhar necessitam de permissões elevadas, qualquer que seja a solução terás sempre de ter isso em conta. - O utilizador tem que ter sessão iniciada para correr? Um serviço executa fora das sessões normais de utilizadores. Podes configurar para executar com uma conta de utilizador específica. - Se for portátil deve executar só com bateria? Deve executar se o pc não estiver idle? Impossível de controlar apenas com o que o SCM oferece, logo se usares um serviço terás de controlar isto manualmente. - Vale a pena correr se não houver ligação de rede? Não será algo que a aplicação vê antes de tentar executar a tarefa? Acho que não tem a ver com o sistema de agendamento usado. - Devo guardar um histórico de execuções? Seja com serviço seja com tarefas agendas a facilidade de registar execuções é a mesma. - Devo interromper a tarefa se demorar mais de x tempo? Outra coisa que me parece dependente do que a aplicação faz e não do tipo de sistema usado para repetição. Naturalmente, usa o que te parecer melhor, quer tarefas agendadas quer serviços com timers são relativamente simples de usar na execução de tarefas com intervalos regulares. O que escrevi é mais um opinião que outra coisa, pessoalmente sinto que os serviços são mais fiáveis, pelo menos têm falhado menos. www.sergiolopes.eu Link to comment Share on other sites More sharing options...
bruno1234 Posted June 29, 2012 at 06:49 PM Report Share #466491 Posted June 29, 2012 at 06:49 PM Viva, knitter, mesmo usando o serviço tenho de ter em atenção os aspectos referidos pelo bruno1234, certo? Neste momento, ainda não estou a usar o console application que criei! Quando tiver mesmo que definir uma solução definitiva e se tiver dúvidas exponho-as aqui. Obrigado pela atenção! Aquilo são apenas casos em que o agendador de tarefas do windows faz, e que não precisas de fazer nenhum código para teres aquelas funcionalidades. Só são úteis se precisares delas. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now