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.
Panggilan semisinkron adalah sarana yang direkomendasikan untuk memanggil metode WMI, seperti IWbemServices::ExecMethod dan metode penyedia, seperti metode Chkdsk dari Win32_LogicalDisk Class.
Salah satu kerugian pemrosesan sinkron adalah bahwa utas pemanggil diblokir hingga panggilan selesai. Penyumbatan dapat menyebabkan keterlambatan waktu pemrosesan. Sebaliknya, panggilan asinkron harus mengimplementasikan SWbemSink dalam skrip. Di C++, kode asinkron harus mengimplementasikan antarmukaIWbemObjectSink, menggunakan beberapa utas, dan mengontrol alur informasi kembali ke pemanggil. Kumpulan hasil besar dari kueri, misalnya, dapat memakan waktu yang cukup lama untuk mengirimkan dan memaksa pemanggil untuk menghabiskan sumber daya sistem yang signifikan untuk menangani pengiriman.
Pemrosesan semisinkron memecahkan masalah penyumbatan utas dan pengiriman yang tidak terkontrol dengan melakukan pemantauan pada objek status khusus yang mengimplementasikan antarmuka IWbemCallResult. Dengan menggunakan IWbemCallResult, Anda dapat meningkatkan kecepatan dan efisiensi kueri, enumerasi, dan pemberitahuan peristiwa.
Prosedur berikut menjelaskan cara melakukan panggilan semisinkron dengan antarmukaIWbemServices.
Untuk melakukan panggilan semisinkron dengan antarmuka IWbemServices
Buat panggilan Anda seperti biasa, tetapi dengan bendera WBEM_FLAG_RETURN_IMMEDIATELY diatur dalam parameter IFlags.
Anda dapat menggabungkan WBEM_FLAG_RETURN_IMMEDIATELY dengan bendera lain yang valid untuk metode tertentu. Misalnya, gunakan flag WBEM_FLAG_FORWARD_ONLY untuk semua pemanggilan yang mengembalikan enumerator. Mengatur bendera ini dalam kombinasi menghemat waktu dan ruang, dan meningkatkan responsivitas.
Lakukan polling untuk hasil Anda.
Jika Anda memanggil metode yang mengembalikan enumerator, seperti IWbemServices::CreateClassEnum atau IWbemServices::ExecQuery, Anda dapat melakukan polling enumerator dengan metode IEnumWbemClassObject::Next atau IEnumWbemClassObject::NextAsync. Panggilan IEnumWbemClassObject::NextAsync tidak memblokir dan segera kembali. Di latar belakang, WMI mulai mengirimkan jumlah objek yang diminta dengan memanggil IWbemObjectSink::Menunjukkan. WMI kemudian berhenti dan menunggu panggilan NextAsync lainnya.
Jika Anda memanggil metode yang tidak mengembalikan enumerator, seperti IWbemServices::GetObject, Anda harus mengatur parameter ppCallResult ke pointer yang valid. Gunakan IWbemCallResult::GetCallStatus pada pointer yang dikembalikan untuk mengambil WBEM_S_NO_ERROR.
Selesaikan panggilan Anda.
Untuk panggilan yang mengembalikan enumerator, WMI memanggil IWbemObjectSink::SetStatus untuk melaporkan penyelesaian operasi. Jika Anda tidak memerlukan seluruh hasilnya, rilis enumerator dengan memanggil IEnumWbemClassObject::Merilis metode. Memanggil Release menyebabkan WMI melakukan pembatalan pengiriman semua objek yang tersisa.
Untuk panggilan yang tidak menggunakan enumerator, ambil objekGetCallStatus melalui parameter plStatus metode Anda.
Contoh kode C++ dalam topik ini memerlukan pernyataan #include berikut untuk dikompilasi dengan benar.
#include <comdef.h>
#include <wbemidl.h>
Contoh kode berikut menunjukkan cara melakukan panggilan semisinkron ke GetObject.
void GetObjSemiSync(IWbemServices *pSvc)
{
IWbemCallResult *pCallRes = 0;
IWbemClassObject *pObj = 0;
HRESULT hRes = pSvc->GetObject(_bstr_t(L"MyClass=\"AAA\""), 0,
0, 0, &pCallRes
);
if (hRes || pCallRes == 0)
return;
while (true)
{
LONG lStatus = 0;
HRESULT hRes = pCallRes->GetCallStatus(5000, &lStatus);
if ( hRes == WBEM_S_NO_ERROR || hRes != WBEM_S_TIMEDOUT )
break;
// Do another task
}
hRes = pCallRes->GetResultObject(5000, &pObj);
if (hRes)
{
pCallRes->Release();
return;
}
pCallRes->Release();
// Use the object.
// ...
// Release it.
// ===========
pObj->Release(); // Release objects not owned.
}
Topik terkait