Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pemberitahuan peristiwa asinkron adalah teknik yang memungkinkan aplikasi untuk terus memantau peristiwa tanpa memonopoli sumber daya sistem. Pemberitahuan peristiwa asinkron memiliki batasan keamanan yang sama dengan panggilan asinkron lainnya. Anda dapat melakukan panggilan semisinkron sebagai gantinya. Untuk informasi selengkapnya, lihat Memanggil Metode.
Antrean peristiwa asinkron yang dirutekan ke klien berpotensi tumbuh sangat besar. Oleh karena itu, WMI menerapkan kebijakan di seluruh sistem untuk menghindari kehabisan memori. WMI memperlambat event, atau mulai membuang event dari antrian ketika antrian tumbuh melewati ukuran tertentu.
WMI menggunakan properti LowThresholdOnEvents dan HighThresholdOnEvents dari kelas Win32_WMISetting untuk menetapkan batasan pada pencegahan kehabisan memori. Nilai minimum menunjukkan kapan WMI harus mulai memperlambat pemberitahuan peristiwa, dan nilai maksimum menunjukkan kapan harus mulai menghilangkan peristiwa. Nilai default untuk ambang batas rendah dan tinggi adalah 1000000 (10 MB) dan 2000000 (20 MB). Selain itu, Anda dapat mengatur properti MaxWaitOnEvents untuk menjelaskan jumlah waktu yang harus ditunggu WMI sebelum menghapus peristiwa. Nilai default untuk MaxWaitOnEvents adalah 2000, atau 2 detik.
Menerima Pemberitahuan Peristiwa Asinkron di VBScript
Panggilan pembuatan skrip untuk menerima pemberitahuan peristiwa pada dasarnya sama dengan semua panggilan asinkron dengan masalah keamanan yang sama. Untuk informasi selengkapnya, lihat Melakukan Panggilan Asinkron dengan VBScript.
Untuk menerima pemberitahuan peristiwa asinkron di VBScript
Buat objek sink dengan memanggil WScript.CreateObject dan menentukan progid "WbemScripting" dan jenis objek SWbemSink. Objek sink menerima pemberitahuan.
Tulis subroutine untuk setiap peristiwa yang ingin Anda tangani. Tabel berikut mencantumkan peristiwa SWbemSink.
Peristiwa Arti OnObjectReady Melaporkan pengembalian objek ke sink. Menggunakan panggilan ini mengembalikan satu objek setiap kali sampai operasi selesai. OnCompleted Melaporkan ketika panggilan asinkron selesai. Kejadian ini tidak pernah terjadi jika operasi tidak pasti. OnObjectPut Melaporkan penyelesaian operasi penyimpanan asinkron. Kejadian ini mengembalikan jalur objek instans atau kelas yang disimpan. SedangBerlangsung Melaporkan status panggilan asinkron yang sedang berlangsung. Tidak semua penyedia mendukung laporan kemajuan sementara. Batalkan Membatalkan semua operasi asinkron tertunda yang terkait dengan penampungan objek ini.
Contoh kode VBScript berikut memberitahukan tentang penghapusan proses dengan waktu jeda polling 10 detik. Dalam skrip ini, subroutine SINK_OnObjectReady menangani kejadian peristiwa. Dalam contoh, objek sink diberi nama "Sink", namun Anda dapat memberi nama objek ini seperti yang Anda pilih.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set MySink = WScript.CreateObject( _
"WbemScripting.SWbemSink","SINK_")
objWMIservice.ExecNotificationQueryAsync MySink, _
"SELECT * FROM __InstanceDeletionEvent" _
& " WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'"
WScript.Echo "Waiting for events..."
While (True)
Wscript.Sleep(1000)
Wend
Sub SINK_OnObjectReady(objObject, objAsyncContext)
Wscript.Echo "__InstanceDeletionEvent event has occurred."
End Sub
Sub SINK_OnCompleted(objObject, objAsyncContext)
WScript.Echo "Event call complete."
End Sub
Menerima Pemberitahuan Peristiwa Asinkron di C++
Untuk melakukan pemberitahuan asinkron, Anda membuat utas terpisah semata-mata untuk memantau dan menerima peristiwa dari Instrumentasi Manajemen Windows (WMI). Ketika utas tersebut menerima pesan, utas tersebut memberitahu aplikasi utama Anda.
Dengan mendedikasikan utas terpisah, Anda mengizinkan proses utama Anda untuk melakukan aktivitas lain sambil menunggu suatu kejadian tiba. Pengiriman pemberitahuan asinkron meningkatkan performa tetapi mungkin memberikan keamanan yang lebih sedikit dari yang Anda inginkan. Di C++, Anda memiliki opsi untuk menggunakan antarmukaIWbemUnsecuredApartment atau melakukan pemeriksaan akses pada deskriptor keamanan. Untuk informasi selengkapnya, lihat Mengatur Keamanan pada panggilan asinkron.
Untuk menyiapkan pemberitahuan peristiwa asinkron
Sebelum menginisialisasi pemberitahuan asinkron apa pun, pastikan parameter penghindaran kehabisan memori Anda disetel dengan benar di Win32_WMISetting.
Tentukan jenis peristiwa apa yang ingin Anda terima.
WMI mendukung peristiwa intrinsik dan ekstrinsik. Peristiwa intrinsik adalah peristiwa yang telah ditentukan sebelumnya oleh WMI, sedangkan peristiwa ekstrinsik adalah peristiwa yang ditentukan oleh penyedia pihak ketiga. Untuk informasi selengkapnya, lihat Menentukan Jenis Peristiwa untuk Menerima.
Prosedur berikut menjelaskan cara menerima pemberitahuan peristiwa asinkron di C++.
Untuk menerima pemberitahuan peristiwa asinkron di C++
Siapkan aplikasi Anda dengan melakukan panggilan ke fungsi CoInitializeEx dan CoInitializeSecurity .
Memanggil CoInitializeEx menginisialisasi COM, sementara CoInitializeSecurity memberikan izin kepada WMI untuk memanggil proses konsumen. Fungsi CoInitializeEx juga memberi Anda kemampuan untuk memprogram aplikasi multithreaded, yang diperlukan untuk pemberitahuan asinkron. Untuk informasi selengkapnya, lihat MempertahankanKeamanan WMI .
Kode dalam topik ini memerlukan referensi berikut dan pernyataan #include untuk dikompilasi dengan benar.
#define _WIN32_DCOM #include <iostream> using namespace std; #include <wbemidl.h>Contoh kode berikut menjelaskan cara menyiapkan konsumen peristiwa sementara dengan panggilan ke CoInitializeEx dan CoInitializeSecurity.
void main(int argc, char **argv) { HRESULT hr = 0; hr = CoInitializeEx (0, COINIT_MULTITHREADED); hr = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if (FAILED(hr)) { CoUninitialize(); cout << "Failed to initialize security. Error code = 0x" << hex << hr << endl; return; } // ... }Buat objek sink melalui antarmukaIWbemObjectSink.
WMI menggunakan IWbemObjectSink untuk mengirim pemberitahuan peristiwa dan melaporkan status pada operasi asinkron atau pemberitahuan peristiwa.
Daftarkan konsumen peristiwa Anda dengan melakukan pemanggilan ke metode IWbemServices::ExecNotificationQueryAsync.
Pastikan parameter pResponseHandler menunjuk ke objek sink yang dibuat pada langkah sebelumnya.
Tujuan pendaftaran adalah untuk hanya menerima pemberitahuan yang diperlukan. Menerima pemberitahuan berlebihan membuang-buang waktu pemrosesan dan pengiriman; dan tidak menggunakan kemampuan pemfilteran WMI secara maksimal.
Namun, konsumen sementara dapat menerima lebih dari satu jenis peristiwa. Dalam hal ini, konsumen sementara harus melakukan panggilan terpisah ke IWbemServices::ExecNotificationQueryAsync untuk setiap jenis peristiwa. Misalnya, konsumen mungkin memerlukan pemberitahuan ketika proses baru dibuat (peristiwa pembuatan instans atau __InstanceCreationEvent) dan untuk perubahan pada kunci registri tertentu (peristiwa registri seperti RegistryKeyChangeEvent). Oleh karena itu, konsumen melakukan satu panggilan ke ExecNotificationQueryAsync untuk mendaftar untuk peristiwa pembuatan instans dan panggilan lain ke ExecNotificationQueryAsync untuk mendaftar untuk peristiwa registri.
Jika Anda memilih untuk membuat pemroses peristiwa yang terdaftar untuk beberapa kejadian, Anda harus menghindari mendaftarkan beberapa kelas dengan sink yang sama. Sebagai gantinya, gunakan sink terpisah untuk setiap kelas peristiwa terdaftar. Memiliki sink khusus menyederhanakan pemrosesan dan mempermudah pemeliharaan, memungkinkan Anda membatalkan satu pendaftaran tanpa memengaruhi yang lain.
Lakukan aktivitas yang diperlukan di konsumen acara Anda.
Langkah ini harus berisi sebagian besar kode Anda dan menyertakan aktivitas seperti menampilkan peristiwa ke antarmuka pengguna.
Setelah selesai, batalkan pendaftaran konsumen peristiwa sementara dengan memanggil peristiwa IWbemServices::CancelAsyncCall.
Terlepas dari apakah panggilan ke CancelAsyncCall berhasil atau gagal, jangan hapus objek sink hingga jumlah referensi objek mencapai nol. Untuk informasi selengkapnya, lihat Memanggil Sebuah Metode.