Transisi Status Layanan
Layanan bertanggung jawab untuk melaporkan perubahan statusnya ke manajer kontrol layanan (SCM). Program kontrol layanan dan sistem dapat mengetahui status layanan hanya dari SCM, jadi penting bahwa layanan melaporkan statusnya dengan benar. Layanan melaporkan statusnya dengan memanggil fungsiSetServiceStatusdengan pointer ke struktur SERVICE_STATUS yang diinisialisasi sepenuhnya. Anggota dwCurrentState berisi status layanan yang akan dilaporkan.
Status awal layanan SERVICE_STOPPED. Ketika SCM memulai layanan, SCM mengatur status layanan ke SERVICE_START_PENDING dan memanggil fungsi ServiceMain layanan. Layanan kemudian menyelesaikan inisialisasinya menggunakan salah satu teknik yang dijelaskan dalam Service ServiceMain Function. Setelah layanan menyelesaikan inisialisasinya dan siap untuk mulai menerima permintaan kontrol, layanan memanggil SetServiceStatus untuk melaporkan SERVICE_RUNNING dan menentukan permintaan kontrol yang siap diterima layanan. Transisi dari SERVICE_START_PENDING ke SERVICE_RUNNING menunjukkan ke SCM dan alat pemantauan layanan bahwa layanan telah berhasil dimulai. Jika layanan melaporkan status selain SERVICE_RUNNING, SCM atau alat pemantauan layanan mungkin menandai layanan sebagai gagal memulai.
SCM hanya mengirim permintaan kontrol yang ditentukan ke layanan (kecuali untuk permintaan SERVICE_CONTROL_INTERROGATE, yang selalu dikirim). Untuk daftar permintaan kontrol yang dapat diterima layanan, lihat dwControlsAccepted anggota struktur SERVICE_STATUS. Untuk informasi tentang mendaftar untuk menerima peristiwa perangkat, lihat fungsi RegisterDeviceNotification.
Status layanan biasanya berubah sebagai akibat dari menangani permintaan kontrol. Mengontrol permintaan yang menyebabkan status layanan berubah termasuk SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE, dan SERVICE_CONTROL_CONTINUE. Jika layanan harus melakukan pemrosesan panjang untuk menangani salah satu permintaan ini, layanan harus membuat utas sekunder untuk melakukan pemrosesan yang panjang dan melaporkan status tertunda yang sesuai ke SCM. (Untuk performa terbaik pada Windows Vista dan versi Windows yang lebih baru, layanan harus menggunakan utas pekerja dari kumpulan utas untuk tujuan ini.) Layanan kemudian harus melaporkan transisi status selesai ketika pemrosesan panjang selesai. Untuk informasi selengkapnya tentang menangani permintaan kontrol, lihat Fungsi Penanganan Kontrol Layanan .
Hanya transisi status layanan tertentu yang valid. Diagram berikut menunjukkan transisi yang valid.
Status layanan yang dilaporkan ke SCM menentukan bagaimana SCM berinteraksi dengan layanan. Misalnya, jika layanan melaporkan SERVICE_STOP_PENDING, SCM tidak mengirimkan permintaan kontrol lebih lanjut ke layanan karena status ini menunjukkan bahwa layanan dimatikan. Status berikutnya yang dilaporkan oleh layanan harus SERVICE_STOPPED karena itu adalah satu-satunya status yang valid setelah SERVICE_STOP_PENDING. Namun, jika layanan melaporkan transisi yang tidak valid, SCM tidak gagal dalam panggilan.
Diagram berikut menunjukkan transisi status layanan secara lebih rinci, termasuk permintaan kontrol yang dimulai oleh program kontrol layanan (klien layanan) dan SetServiceStatus panggilan yang dilakukan layanan untuk melaporkan perubahan status ke SCM. Seperti disebutkan sebelumnya, SCM hanya mengirim permintaan kontrol yang telah ditentukan layanan yang akan diterimanya, sehingga layanan mungkin tidak menerima semua permintaan yang ditunjukkan dalam diagram.
Topik terkait