Udostępnij za pośrednictwem


Przejścia stanu usługi

Usługa jest odpowiedzialna za raportowanie zmian w stanie menedżera kontroli usług (SCM). Programy sterowania usługami i system mogą sprawdzić stan usługi tylko z poziomu programu SCM, dlatego ważne jest, aby usługa prawidłowo zgłaszała jego stan. Usługa zgłasza swój stan, wywołując funkcję SetServiceStatus ze wskaźnikiem do w pełni zainicjowanej struktury SERVICE_STATUS. Element dwCurrentState składowej struktury zawiera stan usługi do raportowania.

Początkowy stan usługi jest SERVICE_STOPPED. Gdy narzędzie SCM uruchamia usługę, ustawia stan usługi na SERVICE_START_PENDING i wywołuje funkcję ServiceMain usługi. Następnie usługa kończy inicjowanie przy użyciu jednej z technik opisanych w ServiceMain Function. Po zakończeniu inicjowania usługi i rozpoczęciu odbierania żądań kontroli usługa wywołuje SetServiceStatus raportować SERVICE_RUNNING i określać żądania kontroli, które usługa jest gotowa zaakceptować. Przejście z SERVICE_START_PENDING do SERVICE_RUNNING wskazuje na narzędzia SCM i monitorowanie usług, które usługa została pomyślnie uruchomiona. Jeśli usługa zgłasza stan inny niż SERVICE_RUNNING, narzędzie SCM lub narzędzia do monitorowania usług mogą oznaczać usługę jako nieudaną.

Program SCM wysyła tylko określone żądania kontroli do usługi (z wyjątkiem żądania SERVICE_CONTROL_INTERROGATE, które jest zawsze wysyłane). Aby uzyskać listę żądań kontroli akceptowanych przez usługę, zobacz dwControlsAccepted składową struktury SERVICE_STATUS. Aby uzyskać informacje na temat rejestrowania w celu odbierania zdarzeń urządzenia, zobacz funkcję RegisterDeviceNotification.

Stan usługi zwykle zmienia się w wyniku obsługi żądania kontroli. Kontroluj żądania, które powodują zmianę stanu usługi, obejmują SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE i SERVICE_CONTROL_CONTINUE. Jeśli usługa musi wykonywać długie przetwarzanie, aby obsłużyć dowolne z tych żądań, powinien utworzyć wątek pomocniczy, aby wykonać długotrwałe przetwarzanie i zgłosić odpowiedni stan oczekiwania do SCM. (Aby uzyskać najlepszą wydajność w systemie Windows Vista i nowszych wersjach systemu Windows, usługa powinna używać wątku roboczego z puli wątków w tym celu). Usługa powinna następnie zgłosić ukończone przejście stanu po zakończeniu długotrwałego przetwarzania. Aby uzyskać więcej informacji na temat obsługi żądań kontroli, zobacz Service Control Handler Function.

Prawidłowe są tylko niektóre przejścia stanu usługi. Na poniższym diagramie przedstawiono prawidłowe przejścia.

prawidłowe przejścia stanu usługi

Stan usługi zgłoszony do programu SCM określa sposób interakcji SCM z usługą. Jeśli na przykład usługa zgłasza SERVICE_STOP_PENDING, SCM nie przesyła dalszych żądań kontroli do usługi, ponieważ ten stan wskazuje, że usługa jest zamykana. Następny stan zgłoszony przez usługę powinien być SERVICE_STOPPED, ponieważ jest to jedyny prawidłowy stan po SERVICE_STOP_PENDING. Jeśli jednak usługa zgłasza nieprawidłowe przejście, polecenie SCM nie kończy się niepowodzeniem.

Na poniższym diagramie przedstawiono bardziej szczegółowe przejścia stanu usługi, w tym żądania kontroli zainicjowane przez program kontroli usługi (klienta usługi) i SetServiceStatus wywołania, które usługa wprowadza w celu raportowania zmian stanu w programie SCM. Jak wspomniano wcześniej, narzędzie SCM wysyła tylko żądania kontroli, które usługa określiła, że zaakceptuje, więc usługa może nie odbierać wszystkich żądań przedstawionych na diagramie.

przejścia stanu usługi szczegółowo

ControlService

ControlServiceEx

SetServiceStatus