Fórum Criar uma aplicação que rode como Serviço no WinXP #235698
02/06/2004
0
[color=red:eb34d40f57]Título alterado pelo Moderador oTTo. Removido: ´Serviço´.[/color:eb34d40f57]
Aamorim
Curtir tópico
+ 0Posts
10/06/2004
Lbcosta
-------------------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
type
TServiceThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
TService1 = class(TService)
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
{ Private declarations }
ServiceThread: TServiceThread;
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
Service1: TService1;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;
function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
{ TServiceThread }
procedure TServiceThread.Execute;
begin
while not (Terminated) do
begin
// coloque aki o codigo que o serviço deve executar
end;
end;
{ TService1 }
procedure TService1.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
ServiceThread.Resume;
Continued := True;
end;
procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
ServiceThread.Suspend;
Paused := True;
end;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
ServiceThread := TServiceThread.Create(False);
Started := True;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
ServiceThread.Terminate;
Stopped := True;
end;
end.
-------------------------------------------------------------------------------------
Se o seu serviço tiver que obter alguma ação do usuário ou exibir alguma msg na tela a propriedade Interactive deve ser setada para True;
Para instalar o serviço vc deve digitar project1.exe /install
Para deinstalar o serviço vc deve digitar project1.exe /uninstall
Para rodar o serviço: net start ´nome do seu serviço´
Para parar o serviço: net stop ´nome do seu serviço´
O serviço tb pode ser iniciado e parado no ´gerenciador do computador´
O nome do serviço é definido no propriedade DisplayName
Espero que tenha ajudado.
Gostei + 0
05/09/2005
Ariovaldo
Este Serviço deve conectar-se ao Banco de Dados SQL Server não estou conseguindo conectar com o Banco pois já coloquei a Conexão em varios eventos em todos os casos a CPU da Maquina vai a 100¬ já coloquei o comando Slep más o problema persiste.
o Outro Problema é o seguinte meu serviço funciona atraves do componente Timer conforme o Exemplo Abaixo Meu código deveria ser locado dentro desta procedura porém preciso colocar no evento On timer do Componente Time como poderia fazer isso?
procedure TServiceThread.Execute;
begin
while not (Terminated) do
begin
// coloque aki o codigo que o serviço deve executar
end;
end;
Gostei + 0
05/09/2005
Massuda
Outra coisa que pode estar ocorrendo é que como os serviços são iniciados no boot do Windows, pode ser que sua conexão com o BD dependa de uma conexão de rede que ainda não está pronta para uso logo depois que o Windows boota.
Gostei + 0
05/09/2005
Ariovaldo
Com relação ao Componente TTimer o Colega Massuda nos informou que não pode ser usado porém só para teste eu havia colocado esta Rotina abaixo para simplesmente a cada 1 Minuto ela escreva a data e a Hora em um arquivo texto para mim e aparentemente esta funcionando, más como o Massuda Informou o TTimer não deve ser Utilizado portanto gostaria de solicitar se alguém tiver uma rotina para escrever este mesmo Arquivo só que usando [b:2b5c494f13]WaitForSingleObject[/b:2b5c494f13] que foi a sugestão do Massuda.
procedure TFormServico.Timer1Timer(Sender: TObject);
Var
ArqTXT : TextFile;
Arq : String;
begin
Arq := extractFilePath(ParamStr(0)) + ´Arq\´ + ´Arq´ + FormatDateTime(´dd-mm-yyyy´,Date) + ´.TXT´;
AssignFile(ArqTXT,Arq);
If not FileExists(Arq) then
Rewrite(ArqTXT,Arq);
Append(ArqTXT);
WriteLn(ArqTXT, ´Data: ´ + FormatDateTime(´dd/mm/yyyy´,Date) + ´ Hora:´ + FormatDateTime(´hh:nn:ss´,Time));
CloseFile(ArqTXT);
end;
Gostei + 0
06/09/2005
Ariovaldo
Gostei + 0
06/09/2005
Massuda
Gostei + 0
06/09/2005
Ariovaldo
Gostei + 0
06/09/2005
Ariovaldo
Gostei + 0
06/09/2005
Ariovaldo
Gostei + 0
08/09/2005
Massuda
type TServiceThread = class(TThread) protected procedure Execute; override; end; .... uses SyncObjs, ... procedure TServiceThread.Execute; var E: TEvent; ArqTXT: TextFile; Arq: String; begin E := TEvent.Create(nil, False, False, ´´); while not (Terminated) do begin E.WaitFor(1000); Arq := ExtractFilePath(... AssignFile(ArqTXT, Arq); .... CloseFile(ArqTXT); end; E.Free; end;
Gostei + 0
26/09/2005
Ariovaldo
Abraços
Gostei + 0
26/10/2005
Marioguedes
Gostei + 0
18/01/2006
Ariovaldo
type TServiceThread = class(TThread) protected procedure Execute; override; end; .... uses SyncObjs, ... procedure TServiceThread.Execute; var E: TEvent; ArqTXT: TextFile; Arq: String; begin E := TEvent.Create(nil, False, False, ´´); while not (Terminated) do begin E.WaitFor(1000); Arq := ExtractFilePath(... AssignFile(ArqTXT, Arq); .... CloseFile(ArqTXT); end; E.Free; end;
Pessoal conforme o Exemplo acima escrito pelo Massuda eu consegui fazer funcionar as rotinas que precisam aguardar 1 Hora ou seja a cada 60 minutos a rotina é executada. agora eu tenho outra rotina que é executada a cada 10 Minuros neste caso como poderia ser feito? tenho que criar outro serviço ou existe como adicionar outra Thread e escrever o código nesta nova Thread?
Obrigado a todos
Gostei + 0
18/01/2006
Ariovaldo
Gostei + 0
18/01/2006
Massuda
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)