I’m working in a service whose main loop looks like this:
while (fServer.ServerState = ssStarted) and (Self.Terminated = false) do
begin
Self.ServiceThread.ProcessRequests(false);
ProcessFiles;
Sleep(3000);
end;
ProcessRequests is a lot like Application.ProcessMessages. I can’t pass true to it because if I do then it blocks until a message is received from Windows, and ProcessFiles won’t run, and it has to run continually. The Sleep is there to keep the CPU usage down.
This works just fine until I try to shut down the service from Windows’s service management list. When I hit Stop, it sends a message and expects to get a response almost immediately, and if it’s in the middle of that Sleep command, Windows will give me an error that the service didn’t respond to the Stop command.
So what I need is to say “Sleep for 3000 or until you receive a message, whichever comes first.” I’m sure there’s an API for that, but I’m not sure what it is. Does anyone know?
Use a timer to run ProcessFiles instead of hacking it into main application loop. Then ProcessFiles will run in the interval you want and the messages will be processed correctly, not taking 100 % CPU.