Ir para conteúdo

POWERED BY:

Arquivado

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

thalesoli

Windows Service em Delphi

Recommended Posts

Bom dia pessoal

 

Estou tentando criar um serviço através do delphi. Estou seguindo o esquema de alguns tutoriais, mas todos são básicos e não criam serviços com forms visíveis.

 

O problema que estou tendo é assim:

  • a aplicação é um gerenciador de backup para bancos firebird, com agendador entre outras tarefas.
  • na aplicação existe um form principal que contêm todas as atividades do programa.
  • eu criei um serviço e configurei nas propriedades dele para ter interactive para true.
  • e no método execute dele, eu crio o form através de uma thread pois quando colocava somente no método execute do serviço, a aplicação não conseguia receber respostas do teclado.
  • só que o form que é aberto no thread não está funcionando.. não abre direito...
abaixo está o código do execute do serviço e da thread.Código do serviço:

 

procedure TsrvAdmin.ServiceExecute(Sender : TService);

begin

trdPrincipal := trdPrincipal.Create;

while not Terminated do

ServiceThread.ProcessRequests(True);

trdPrincipal.Terminate;

end;

 

Código da thread:

 

procedure TPrincipalThread.Execute;

begin

repeat

if not Assigned(frmPrincipal) and processExists('explorer.exe') then

begin

frmPrincipal := TfrmPrincipal.Create(srvAndesAdmin);

frmPrincipal.Show;

end;

Forms.Application.ProcessMessages;

Sleep(1);

until Terminated;

end;

 

o código do serviço é um que eu peguei nos tutoriais mais a execução da thread.

 

o problema todo está em que tem hora que não consigo abrir o form.

 

alguém já conseguiu fazer um serviço desse jeito?

 

desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma sugestão seria você criar um form a parte somente para configurações, acho isto pois vai deixar o seu serviço mais leve e rápido, visto que também vai ocupar menos espaço em memória, o que precisa fazer seria somente no serviço ter o procedimento de backup, e no outro .exe é a tela de configuração, podendo fazer assim ele gravar um .ini para que o serviço pegue as configurações, e dentro do programa de serviço, poderia fazer com que ele fique lendo o arquivo a cada minuto, ou sempre que é para ele rodar o procedimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma sugestão seria você criar um form a parte somente para configurações, acho isto pois vai deixar o seu serviço mais leve e rápido, visto que também vai ocupar menos espaço em memória, o que precisa fazer seria somente no serviço ter o procedimento de backup, e no outro .exe é a tela de configuração, podendo fazer assim ele gravar um .ini para que o serviço pegue as configurações, e dentro do programa de serviço, poderia fazer com que ele fique lendo o arquivo a cada minuto, ou sempre que é para ele rodar o procedimento.

Certo.. vou modificar o serviço e colocar somente a parte do backup para ser executado via serviço,

mas como eu faria para deixar a parte de configuração também funcionando ao mesmo tempo, mas so quando estiver logado?

 

desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem várias formas, poderia fazer usando uma conexão por socket, onde o aplicativo cliente se conecta no servidor, cliente seria o programa de configuração e servidor o programa que roda no serviço, se conectar e enviar as informações, poderia ainda usar monitoramento de algum arquivo específico, na aba Samples tem um componente chamado TShellChangeNotifier, com ele você consegue monitorar uma pasta, ou seja, se esta pasta sofrer algum mudança, ele gera um evento OnChange, e dentro deste pode colocar a funcionalidade para reler o arquivo .ini, pode ainda colocar dentro do programa serviço um timer que fica lendo algum registro do windows, quando este estiver na situação X ele faz a releitura do arquivo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem várias formas, poderia fazer usando uma conexão por socket, onde o aplicativo cliente se conecta no servidor, cliente seria o programa de configuração e servidor o programa que roda no serviço, se conectar e enviar as informações, poderia ainda usar monitoramento de algum arquivo específico, na aba Samples tem um componente chamado TShellChangeNotifier, com ele você consegue monitorar uma pasta, ou seja, se esta pasta sofrer algum mudança, ele gera um evento OnChange, e dentro deste pode colocar a funcionalidade para reler o arquivo .ini, pode ainda colocar dentro do programa serviço um timer que fica lendo algum registro do windows, quando este estiver na situação X ele faz a releitura do arquivo...

Marcio..

 

este aplicativo é bem mais complexo.. pois ele engloba:

  • Executa Scripts;
  • Roda Gbak / Gfix;
  • Agenda Backup / Cópia de Segurança;
Para separar, teria q de certo modo duplicar as tarefas..

 

bom vou estudar aqui.. acho q vou montar cada tarefa numa bpl separada para que não seja duplicado nada.

 

muito obrigado pela sua ajuda

 

falow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranqüilo, sem problemas, foi somente um dica... :D

Já trabalhei com programas que rodam no serviço, mas nenhum vez precisei de tela de configuração...

 

Originalmente o programa não era.. mas como meus clientes usam Terminal Service, o programa tava sendo iniciado uma vez para cada um e eu queria q não fizesse isso..

 

o serviço q eu criei toda vez q eu do logoff e volto novamente, ele abre outra instancia.. e trava a primeira.. tem como evitar ?

 

falow

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa, realmente não sei como poderia resolver isto, no meu caso sempre fica rodando..

 

Mesmo assim grande Marcio..

 

muito obrigado pela sua atenção.. vou fazer um estudo aqui e se eu achar a solução eu te falo ok?

 

falow

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

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.