Bagikan melalui


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, sehingga penting bahwa layanan melaporkan statusnya dengan benar. Layanan melaporkan statusnya dengan memanggil fungsi SetServiceStatus dengan penunjuk ke struktur SERVICE_STATUS yang diinisialisasi sepenuhnya. Anggota dwCurrentState dari struktur 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 Fungsi ServiceMain. Setelah layanan menyelesaikan inisialisasinya dan siap untuk mulai menerima permintaan kontrol, layanan memanggil SetServiceStatus untuk melaporkan SERVICE_RUNNING dan menentukan permintaan kontrol yang disiapkan layanan untuk diterima. 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 anggota dwControlsAccepted dari struktur SERVICE_STATUS . Untuk informasi tentang mendaftar untuk menerima peristiwa perangkat, lihat fungsi RegisterDeviceNotification .

Status layanan biasanya berubah sebagai akibat dari menangani permintaan kontrol. Permintaan kontrol yang menyebabkan status layanan berubah termasuk SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE, dan SERVICE_CONTROL_CONTINUE. Jika layanan harus melakukan pemrosesan yang 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 yang selesai ketika pemrosesan panjang selesai. Untuk informasi selengkapnya tentang menangani permintaan kontrol, lihat Fungsi Handler Kontrol Layanan.

Hanya transisi status layanan tertentu yang valid. Diagram berikut menunjukkan transisi yang valid.

transisi status layanan 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 panggilan SetServiceStatus 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.

transisi status layanan secara rinci

ControlService

ControlServiceEx

SetServiceStatus