Transizioni di stato del servizio
Un servizio è responsabile della segnalazione delle modifiche apportate allo stato di Gestione controllo dei servizi. I programmi di controllo del servizio e il sistema possono individuare lo stato di un servizio solo da Gestione controllo servizi, quindi è importante che un servizio ne segnala lo stato correttamente. Un servizio segnala lo stato chiamando la funzionesetServiceStatuscon un puntatore a una struttura di SERVICE_STATUS completamente inizializzata. Il dwCurrentState membro della struttura contiene lo stato del servizio da segnalare.
Lo stato iniziale di un servizio è SERVICE_STOPPED. Quando Gestione controllo servizi avvia il servizio, imposta lo stato del servizio su SERVICE_START_PENDING e chiama la funzione di serviceMain del servizio. Il servizio completa quindi l'inizializzazione usando una delle tecniche descritte in ServiceMain Function. Dopo che il servizio ha completato l'inizializzazione ed è pronto per iniziare a ricevere le richieste di controllo, il servizio chiama SetServiceStatus per segnalare SERVICE_RUNNING e specificare le richieste di controllo che il servizio è pronto ad accettare. La transizione da SERVICE_START_PENDING a SERVICE_RUNNING indica agli strumenti di gestione configurazione e monitoraggio del servizio avviati correttamente dal servizio. Se il servizio segnala uno stato diverso da SERVICE_RUNNING, gli strumenti SCM o di monitoraggio del servizio potrebbero contrassegnare il servizio come non avviato.
SCM invia al servizio solo le richieste di controllo specificate, ad eccezione della richiesta di SERVICE_CONTROL_INTERROGATE, che viene sempre inviata. Per un elenco delle richieste di controllo che un servizio può accettare, vedere il dwControlsAccepted membro della struttura SERVICE_STATUS. Per informazioni sulla registrazione per ricevere eventi del dispositivo, vedere la funzione RegisterDeviceNotification.
Lo stato del servizio cambia in genere in seguito alla gestione di una richiesta di controllo. Le richieste di controllo che causano la modifica dello stato del servizio includono SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE e SERVICE_CONTROL_CONTINUE. Se il servizio deve eseguire un'elaborazione lunga per gestire una di queste richieste, deve creare un thread secondario per eseguire l'elaborazione lunga e segnalare lo stato in sospeso corrispondente a SCM. Per ottenere prestazioni ottimali in Windows Vista e versioni successive di Windows, il servizio deve usare un thread di lavoro da un pool di thread a questo scopo. Il servizio deve quindi segnalare la transizione dello stato completata al termine dell'elaborazione. Per altre informazioni sulla gestione delle richieste di controllo, vedere funzione del gestore del controllo del servizio.
Sono valide solo determinate transizioni di stato del servizio. Il diagramma seguente illustra le transizioni valide.
Lo stato del servizio segnalato a SCM determina il modo in cui Gestione controllo servizi interagisce con il servizio. Ad esempio, se un servizio segnala SERVICE_STOP_PENDING, SCM non trasmette ulteriori richieste di controllo al servizio perché questo stato indica che il servizio sta arrestando. Lo stato successivo segnalato dal servizio deve essere SERVICE_STOPPED perché è l'unico stato valido dopo SERVICE_STOP_PENDING. Tuttavia, se un servizio segnala una transizione non valida, gestione controllo servizi non ha esito negativo.
Il diagramma seguente illustra in modo più dettagliato le transizioni di stato del servizio, incluse le richieste di controllo avviate da un programma di controllo del servizio (il client del servizio) e le chiamate SetServiceStatus chiamate effettuate da un servizio per segnalare le modifiche dello stato a SCM. Come accennato in precedenza, Gestione controllo servizi invia solo le richieste di controllo che il servizio ha specificato accetterà, quindi un servizio potrebbe non ricevere tutte le richieste visualizzate nel diagramma.
Argomenti correlati