Melakukan Panggilan Semisinkron dengan C++

Panggilan semisinkron adalah sarana yang disarankan untuk memanggil metode WMI, seperti IWbemServices::ExecMethod dan metode penyedia, seperti Metode Chkdsk dari Kelas Win32_LogicalDisk.

Salah satu kerugian pemrosesan sinkron adalah bahwa utas penelepon diblokir hingga panggilan selesai. Penyumbatan dapat menyebabkan keterlambatan waktu pemrosesan. Sebaliknya, panggilan asinkron harus mengimplementasikan SWbemSink dalam skrip. Di C++, kode asinkron harus mengimplementasikan antarmuka IWbemObjectSink , 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 polling objek status khusus yang mengimplementasikan antarmuka IWbemCallResult . Melalui IWbemCallResult, Anda dapat meningkatkan kecepatan dan efisiensi kueri, enumerasi, dan pemberitahuan peristiwa.

Prosedur berikut menjelaskan cara melakukan panggilan semisinkron dengan antarmuka IWbemServices .

Untuk melakukan panggilan semisinkron dengan antarmuka IWbemServices

  1. Lakukan 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 bendera WBEM_FLAG_FORWARD_ONLY untuk semua panggilan yang mengembalikan enumerator. Mengatur bendera ini dalam kombinasi menghemat waktu dan ruang, dan meningkatkan responsivitas.

  2. 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 penunjuk yang valid. Gunakan IWbemCallResult::GetCallStatus pada pointer yang dikembalikan untuk mengambil WBEM_S_NO_ERROR.

  3. Selesaikan panggilan Anda.

    Untuk panggilan yang mengembalikan enumerator, WMI memanggil IWbemObjectSink::SetStatus untuk melaporkan penyelesaian operasi. Jika Anda tidak memerlukan seluruh hasil, lepaskan enumerator dengan memanggil metode IEnumWbemClassObject::Release . Rilis Panggilan menghasilkan WMI membatalkan pengiriman semua objek yang tersisa.

    Untuk panggilan yang tidak menggunakan enumerator, ambil objek GetCallStatus 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.            
  
}

Memanggil Metode