⚠️ PROBLEMA PRINCIPAL: Uso de TTimer en un servicio de Windows
Los servicios NO tienen una interfaz de usuario ni un loop de mensajes visual (como Application.ProcessMessages), por lo que TTimer no funciona como esperas. El TTimer depende del mensaje WM_TIMER, que no se procesa en un servicio como sí en una app VCL normal.
✅ SOLUCIÓN 1: Usa un hilo (TThread) en lugar de TTimer
Así sí puedes ejecutar tareas cada X segundos sin bloquear el servicio.
🧠 Alternativa funcional:
Código Delphi
[-]
type
TWorkerThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TWorkerThread.Execute;
begin
while not Terminated do
begin
TService1(Service1).WriteLog('Thread running...');
Sleep(1000); end;
end;
Y en ServiceStart:
Código Delphi
[-]
var
thread: TWorkerThread;
begin
WriteLog('ServiceStart');
thread := TWorkerThread.Create(False);
Started := True;
end;
Y no olvides terminarlo en ServiceStop si lo mantienes como miembro de la clase.
⚠️ OTRO PROBLEMA: Beep
No uses Beep en servicios. No está permitido en contexto de servicio (no hay usuario con escritorio para oírlo), y puede incluso tirar errores. Quita todas las llamadas a Beep.
⚠️ OTRO DETALLE: Acceso a ruta de usuario desde un servicio
Estás escribiendo el log en:
Código Delphi
[-]C:\Users\Papá\Desktop\...
⚠️ Los servicios se ejecutan como SYSTEM por defecto, no como el usuario que tú eres. Esto significa que esa ruta probablemente no exista o no tenga permisos para escribir.
✅ Solución:
Cambia la ruta del log a una más accesible, como:
Código Delphi
[-]cFile := 'C:\ServiceLogs\Service_Test.txt';
Y asegúrate de que exista la carpeta y tenga permisos.