Transizioni di stato del servizio
Un servizio è responsabile della segnalazione delle modifiche apportate allo stato di Gestione controllo servizi. I programmi di controllo del servizio e il sistema possono individuare lo stato di un servizio solo da Gestione configurazione software, quindi è importante che un servizio segnala correttamente lo stato. Un servizio segnala lo stato chiamando la funzione SetServiceStatus con un puntatore a una struttura SERVICE_STATUS completamente inizializzata. Il membro dwCurrentState della struttura contiene lo stato del servizio da segnalare.
Lo stato iniziale di un servizio è SERVICE_STOPPED. Quando SCM avvia il servizio, imposta lo stato del servizio su SERVICE_START_PENDING e chiama la funzione ServiceMain del servizio. Il servizio completa quindi l'inizializzazione usando una delle tecniche descritte in ServiceMain Function.The service then complete its initialization using one of the techniques described in ServiceMain Function. Al termine dell'inizializzazione del servizio ed è pronto per iniziare a ricevere 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 monitoraggio del servizio e gestione servizi avviati correttamente dal servizio. Se il servizio segnala uno stato diverso da SERVICE_RUNNING, gli strumenti di monitoraggio del servizio o SCM 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 membro dwControlsAccepted della struttura SERVICE_STATUS . Per informazioni sulla registrazione per ricevere gli eventi del dispositivo, vedere la funzione RegisterDeviceNotification .
Lo stato del servizio viene in genere modificato 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 completato al termine dell'elaborazione. Per altre informazioni sulla gestione delle richieste di controllo, vedere Service Control Handler Function.
Sono valide solo determinate transizioni di stato del servizio. Il diagramma seguente illustra le transizioni valide.
Lo stato del servizio segnalato a SCM determina come SCM interagisce con il servizio. Ad esempio, se un servizio segnala SERVICE_STOP_PENDING, Gestione configurazione del servizio 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 servizi non riesce la chiamata.
Il diagramma seguente illustra le transizioni di stato del servizio in modo più dettagliato, incluse le richieste di controllo avviate da un programma di controllo del servizio (il client del servizio) e le chiamate SetServiceStatus apportate da un servizio per segnalare le modifiche dello stato a SCM. Come accennato in precedenza, Gestione configurazione del servizio invia solo le richieste di controllo che il servizio l'ha specificato accetterà, pertanto un servizio potrebbe non ricevere tutte le richieste illustrate nel diagramma.
Argomenti correlati