Um novo projeto será criado e incluirá um fonte com uma classe que representa o Serviço do Windows. A estrutura desse fonte é similar a um Data Module e permite que sejam adicionados componentes não-visuais para uso pelo Serviço - lembre-se que o serviço não tem interface gráfica e, portanto, não faz sentido admitir a inclusão de componentes visuais. O trecho abaixo reproduz a declaração inicial da classe gerada:
type
TWMyService = class(TService)
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
TWMyService = class(TService)
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
Veja que a base para a classe de Serviço chama-se TService. É essa classe da VCL que encapsula um Serviço e quem introduz as propriedades que devemos configurar e os eventos que teremos que responder para que o Serviço execute suas tarefas.
O passo seguinte, então, é configurar visualmente as propriedades, conforme a necessidade. Segue abaixo uma lista com as principais propriedades da classe TService e uma breve explicação de sua utilidade.







Em relação aos eventos disponíveis para a classe TService, o principal é o OnExecute. É aqui que o funcionamento do Serviço ocorre, seja através do monitoramento de eventos, seja através da publicação de meios para comunicação com outros processos (ou ambos). O evento OnExecute é disparado uma única vez e, quando ele termina sua execução, determina também o término da execução do Serviço. Juntando esse fato com o funcionamento da propriedade Terminated citada antes, a codificação do OnExecute tem, na maioria das vezes, a seguinte aparência:
procedure TWMyService.ServiceExecute(Sender: TService);
begin
while (not Terminated) do
begin
{ Processa aqui as tarefas relacionadas com o Serviço }
{ ... }
ReportStatus;
end;
end;
begin
while (not Terminated) do
begin
{ Processa aqui as tarefas relacionadas com o Serviço }
{ ... }
ReportStatus;
end;
end;
No caso do serviço que executa processos agendados na ABC71, esse laço dentro do evento OnExecute verifica de tempos em tempos os registros existentes no banco de dados do ERP e executa o processo numa thread separada quando é atingida a data e hora agendada para execução.
Isso levanta uma outra questão. Onde armazenar as configurações para conexão com o Banco de Dados ? É muito comum que isso seja feito através de um arquivo mas optei por armazenar tais informações no Registry do Windows, mais apropriado na minha opinião. Foi construído, então, um programa com interface gráfica que permite aos usuários configurar a conexão e monitorar a execução dos processos. Como o usuário usado pelo Serviço é diferente do usuário logado no Windows para realizar as confugurações, a gravação no Registry deve ser feita sob a chave HKEY_LOCAL_MACHINE, facilmente acessível por ambos.
Nenhum comentário :
Postar um comentário
OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.
Observação: somente um membro deste blog pode postar um comentário.