Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Semisynchrone aanroepen zijn de aanbevolen methoden voor het aanroepen van WMI-methoden, zoals IWbemServices::ExecMethod- en providermethoden, zoals de methode Chkdsk van de Win32_LogicalDisk Klasse.
Een nadeel van synchrone verwerking is dat de gespreksthread wordt geblokkeerd totdat de aanroep is voltooid. De blokkering kan een vertraging in de verwerkingstijd veroorzaken. Een asynchrone aanroep moet daarentegen SWbemSink- in script implementeren. In C++moet asynchrone code de IWbemObjectSink interface implementeren, meerdere threads gebruiken en de gegevensstroom terugsturen naar de aanroeper. Grote resultatensets van query's kunnen bijvoorbeeld veel tijd in beslag nemen om te leveren en de beller dwingt om aanzienlijke systeemresources te besteden om de levering af te handelen.
Semisynchrone verwerking lost zowel de threadblokkering als onbeheerde leveringsproblemen op door een speciaal statusobject te peilen dat de IWbemCallResult interface implementeert. Via IWbemCallResultkunt u de snelheid en efficiƫntie van query's, opsommingen en gebeurtenismeldingen verbeteren.
In de volgende procedure wordt beschreven hoe u een semisynchrone aanroep maakt met de IWbemServices interface.
Een semisynchrone aanroep met de interface IWbemServices
Doe uw oproep zoals gebruikelijk, maar met de vlag WBEM_FLAG_RETURN_IMMEDIATELY ingesteld in de IFlags-parameter.
U kunt WBEM_FLAG_RETURN_IMMEDIATELY combineren met andere vlaggen die geldig zijn voor de specifieke methode. Gebruik bijvoorbeeld de vlag WBEM_FLAG_FORWARD_ONLY voor alle aanroepen die opsommingen retourneren. Als u deze vlaggen in combinatie instelt, bespaart u tijd en ruimte en verbetert u de reactiesnelheid.
Peiling voor uw resultaten.
Als u een methode aanroept die een enumerator retourneert, zoals IWbemServices::CreateClassEnum of IWbemServices::ExecQuery, kunt u de opsommingsprogramma's peilen met de IEnumWbemClassObject::Next of IEnumWbemClassObject::NextAsync methoden. De IEnumWbemClassObject::NextAsync aanroep wordt niet geblokkeerd en wordt onmiddellijk geretourneerd. Op de achtergrond begint WMI het aangevraagde aantal objecten te leveren door IWbemObjectSink::Indicateaan. WMI stopt en wacht vervolgens op een andere NextAsync aanroep.
Als u een methode aanroept die geen enumerator retourneert, zoals IWbemServices::GetObject, moet u de parameter ppCallResult instellen op een geldige aanwijzer. Gebruik de IWbemCallResult::GetCallStatus op de geretourneerde aanwijzer om WBEM_S_NO_ERRORop te halen.
Voltooi uw gesprek.
Voor een aanroep die een enumerator retourneert, roept WMI IWbemObjectSink::SetStatus aan om de voltooiing van de bewerking te rapporteren. Als u het volledige resultaat niet nodig hebt, laat u de enumerator los door de methode IEnumWbemClassObject aan te roepen::Release methode. Het uitvoeren van Release- zorgt ervoor dat WMI de levering van alle resterende objecten annuleert.
Voor een aanroep die geen enumerator gebruikt, haalt u de GetCallStatus--object op via de parameter plStatus van uw methode.
Voor het C++-codevoorbeeld in dit onderwerp moeten de volgende #include instructies correct worden gecompileerd.
#include <comdef.h>
#include <wbemidl.h>
In het volgende codevoorbeeld ziet u hoe u een semisynchrone aanroep kunt maken naar 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.
}
Verwante onderwerpen