Ich empfehle, einen CreateWaitableTimer zu verwenden. Da kann man auch eine absolute Zeit angeben.
Zudem noch MsgWaitForMultipleObjects für diesen Timer, für ein ShutdownEvent (CreateEvent)
und schon funktioniert es auch ohne diese komische Zeitumrechnung.
Hier ein unvollständiges Beispiel, wie
JWSCL einen Dienst implementiert.
Delphi-Quellcode:
ConnectNamedPipe(Pipe, @OvLapped);
{JwCreateWaitableTimer unterstüzt nur relative Zeit.
Das original API kann auch absolute Zeiten unterstützen.
Hey- jeder ist willkommen eine erweiterte leicht verwendbare
Version beizusteuern.
}
fTimer := JwCreateWaitableTimer(5000
{5sek});
repeat
if Assigned(ServiceThread)
then
ServiceThread.ProcessRequests(False);
SetLastError(0);
WaitResult := JwMsgWaitForMultipleObjects([fServiceStopEvent, OvLapped.hEvent, fTimer], false, INFINITE, QS_ALLINPUT);
if WaitResult = WAIT_OBJECT_0 +1
then
ResetEvent(OvLapped.hEvent);
if WaitResult = WAIT_OBJECT_0 + 2
then
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE);
//tag message as read
if (WaitResult = WAIT_OBJECT_0 + 2
then
TimerEvent!
until WaitResult <> WAIT_OBJECT_0 + 3;
if WaitResult = WAIT_OBJECT_0 +1
then //OvLapped.hEvent