Ver Mensaje Individual
  #2  
Antiguo 10-07-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Reputación: 3
navbuoy Va por buen camino
⚠️ 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); // Espera 1 segundo
  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.

Última edición por navbuoy fecha: 10-07-2025 a las 22:22:32.
Responder Con Cita