Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní WMI s vysokým výkonem je řada rozhraní, která získávají data z třídy čítačů výkonu. Tato rozhraní vyžadují použití aktualizačního objektu ke zvýšení vzorkovací frekvence. Další informace o použití aktualizačního objektu ve skriptování najdete v tématu Přístup k datům o výkonu ve skriptech a úloh rozhraní WMI: Sledování výkonu.
V tomto tématu jsou popsány následující části:
Aktualizace dat o výkonu
Obnovovací objekt zvyšuje výkon zprostředkovatele dat a klienta načtením dat bez překročení hranic procesu. Pokud se klient i server nacházejí na stejném počítači, refresher načte zprostředkovatele s vysokým výkonem do klienta a zkopíruje data přímo z objektů zprostředkovatele do klientských objektů. Pokud se klient a server nacházejí na různých počítačích, aktualizuje se výkon ukládáním objektů do mezipaměti na vzdáleném počítači a přenosem minimálních datových sad do klienta.
Opakování také:
Automaticky znovu připojí klienta ke vzdálené službě WMI, když dojde k chybě sítě nebo se vzdálený počítač restartuje.
Ve výchozím nastavení se refresher pokusí aplikaci znovu připojit k příslušnému vysoce výkonnému poskytovateli, když dojde k selhání vzdáleného připojení mezi těmito dvěma počítači. Pokud chcete zabránit opětovnému připojení, předejte příznak WBEM_FLAG_REFRESH_NO_AUTO_RECONNECT ve volání metody Refresh. Skriptovací klienti musí nastavit vlastnost SWbemRefresher.AutoReconnect na FALSE.
Načte více objektů a výčtů, které poskytují stejní nebo různí zprostředkovatelé.
Umožňuje přidat do aktualizačního prvku více objektů, výčtů nebo obojího.
Vytvoří výčet objektů.
Stejně jako jiní poskytovatelé, vysoce výkonní poskytovatelé můžou vytvořit výčet objektů.
Až dokončíte psaní vysoce výkonného klienta, možná budete chtít zlepšit dobu odezvy. Vzhledem k tomu, že rozhraní IWbemObjectAccess je optimalizované pro rychlost, rozhraní není vnitřně bezpečné. Proto během operace aktualizace nepřistupujte k aktualizovatelnému objektu ani výčtu. Pokud chcete chránit objekty napříč vlákny během volání metody IWbemObjectAccess, použijte metody IWbemObjectAccess::Lock a Metody Unlock. Kvůli lepšímu výkonu synchronizujte vlákna tak, abyste nemuseli zamknout jednotlivá vlákna. Snížení počtu vláken a synchronizace skupin objektů pro operace aktualizace poskytuje nejlepší celkový výkon.
Přidání výčtů do aktualizačního programu WMI
Počet instancí i data v každé instanci se aktualizuje přidáním výčtového objektu do aktualizátoru, aby každé volání IWbemRefresher::Refresh mělo za výsledek úplný výčet.
Následující příklad kódu jazyka C++ vyžaduje správné kompilace následujících odkazů a příkazů #include.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Následující postup ukazuje, jak přidat enumerátor do aktualizačního programu.
Přidání enumerátoru do aktualizačního systému
Volejte metodu IWbemConfigureRefresher::AddEnum pomocí cesty k objektu určeného k aktualizaci a rozhraní IWbemServices.
Refresher vrátí ukazatel na rozhraní IWbemHiPerfEnum. Pro přístup k objektům v výčtu můžete použít rozhraní IWbemHiPerfEnum.
IWbemHiPerfEnum* pEnum = NULL; long lID; IWbemConfigureRefresher* pConfig; IWbemServices* pNameSpace; // Add an enumerator to the refresher. if (FAILED (hr = pConfig->AddEnum( pNameSpace, L"Win32_PerfRawData_PerfProc_Process", 0, NULL, &pEnum, &lID))) { goto CLEANUP; } pConfig->Release(); pConfig = NULL;Vytvořte smyčku, která provádí následující akce:
Aktualizuje objekt pomocí volání IWbemRefresher::Refresh.
Poskytuje pole ukazatelů rozhraní IWbemObjectAccess metodě IWbemHiPerfEnum::GetObjects.
Přistupuje k vlastnostem enumerátoru pomocí metod IWbemObjectAccess předaných do GetObjects.
Popisovač vlastnosti může být předán každé IWbemObjectAccess instanci k načtení aktualizované hodnoty. Klient musí zavolat Release, aby uvolnil ukazatele IWbemObjectAccess vrácené voláním GetObjects.
Příklad
Následující příklad kódu C++ vyčíslí vysoce výkonnou třídu, kde klient načte popisovač vlastnosti z prvního objektu a znovu použije popisovač pro zbytek operace aktualizace. Každé volání metody Refresh aktualizuje počet instancí a data instance.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int __cdecl wmain(int argc, wchar_t* argv[])
{
// To add error checking,
// check returned HRESULT below where collected.
HRESULT hr = S_OK;
IWbemRefresher *pRefresher = NULL;
IWbemConfigureRefresher *pConfig = NULL;
IWbemHiPerfEnum *pEnum = NULL;
IWbemServices *pNameSpace = NULL;
IWbemLocator *pWbemLocator = NULL;
IWbemObjectAccess **apEnumAccess = NULL;
BSTR bstrNameSpace = NULL;
long lID = 0;
long lVirtualBytesHandle = 0;
long lIDProcessHandle = 0;
DWORD dwVirtualBytes = 0;
DWORD dwProcessId = 0;
DWORD dwNumObjects = 0;
DWORD dwNumReturned = 0;
DWORD dwIDProcess = 0;
DWORD i=0;
int x=0;
if (FAILED (hr = CoInitializeEx(NULL,COINIT_MULTITHREADED)))
{
goto CLEANUP;
}
if (FAILED (hr = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, 0)))
{
goto CLEANUP;
}
if (FAILED (hr = CoCreateInstance(
CLSID_WbemLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(void**) &pWbemLocator)))
{
goto CLEANUP;
}
// Connect to the desired namespace.
bstrNameSpace = SysAllocString(L"\\\\.\\root\\cimv2");
if (NULL == bstrNameSpace)
{
hr = E_OUTOFMEMORY;
goto CLEANUP;
}
if (FAILED (hr = pWbemLocator->ConnectServer(
bstrNameSpace,
NULL, // User name
NULL, // Password
NULL, // Locale
0L, // Security flags
NULL, // Authority
NULL, // Wbem context
&pNameSpace)))
{
goto CLEANUP;
}
pWbemLocator->Release();
pWbemLocator=NULL;
SysFreeString(bstrNameSpace);
bstrNameSpace = NULL;
if (FAILED (hr = CoCreateInstance(
CLSID_WbemRefresher,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemRefresher,
(void**) &pRefresher)))
{
goto CLEANUP;
}
if (FAILED (hr = pRefresher->QueryInterface(
IID_IWbemConfigureRefresher,
(void **)&pConfig)))
{
goto CLEANUP;
}
// Add an enumerator to the refresher.
if (FAILED (hr = pConfig->AddEnum(
pNameSpace,
L"Win32_PerfRawData_PerfProc_Process",
0,
NULL,
&pEnum,
&lID)))
{
goto CLEANUP;
}
pConfig->Release();
pConfig = NULL;
// Get a property handle for the VirtualBytes property.
// Refresh the object ten times and retrieve the value.
for(x = 0; x < 10; x++)
{
dwNumReturned = 0;
dwIDProcess = 0;
dwNumObjects = 0;
if (FAILED (hr =pRefresher->Refresh(0L)))
{
goto CLEANUP;
}
hr = pEnum->GetObjects(0L,
dwNumObjects,
apEnumAccess,
&dwNumReturned);
// If the buffer was not big enough,
// allocate a bigger buffer and retry.
if (hr == WBEM_E_BUFFER_TOO_SMALL
&& dwNumReturned > dwNumObjects)
{
apEnumAccess = new IWbemObjectAccess*[dwNumReturned];
if (NULL == apEnumAccess)
{
hr = E_OUTOFMEMORY;
goto CLEANUP;
}
SecureZeroMemory(apEnumAccess,
dwNumReturned*sizeof(IWbemObjectAccess*));
dwNumObjects = dwNumReturned;
if (FAILED (hr = pEnum->GetObjects(0L,
dwNumObjects,
apEnumAccess,
&dwNumReturned)))
{
goto CLEANUP;
}
}
else
{
if (hr == WBEM_S_NO_ERROR)
{
hr = WBEM_E_NOT_FOUND;
goto CLEANUP;
}
}
// First time through, get the handles.
if (0 == x)
{
CIMTYPE VirtualBytesType;
CIMTYPE ProcessHandleType;
if (FAILED (hr = apEnumAccess[0]->GetPropertyHandle(
L"VirtualBytes",
&VirtualBytesType,
&lVirtualBytesHandle)))
{
goto CLEANUP;
}
if (FAILED (hr = apEnumAccess[0]->GetPropertyHandle(
L"IDProcess",
&ProcessHandleType,
&lIDProcessHandle)))
{
goto CLEANUP;
}
}
for (i = 0; i < dwNumReturned; i++)
{
if (FAILED (hr = apEnumAccess[i]->ReadDWORD(
lVirtualBytesHandle,
&dwVirtualBytes)))
{
goto CLEANUP;
}
if (FAILED (hr = apEnumAccess[i]->ReadDWORD(
lIDProcessHandle,
&dwIDProcess)))
{
goto CLEANUP;
}
wprintf(L"Process ID %lu is using %lu bytes\n",
dwIDProcess, dwVirtualBytes);
// Done with the object
apEnumAccess[i]->Release();
apEnumAccess[i] = NULL;
}
if (NULL != apEnumAccess)
{
delete [] apEnumAccess;
apEnumAccess = NULL;
}
// Sleep for a second.
Sleep(1000);
}
// exit loop here
CLEANUP:
if (NULL != bstrNameSpace)
{
SysFreeString(bstrNameSpace);
}
if (NULL != apEnumAccess)
{
for (i = 0; i < dwNumReturned; i++)
{
if (apEnumAccess[i] != NULL)
{
apEnumAccess[i]->Release();
apEnumAccess[i] = NULL;
}
}
delete [] apEnumAccess;
}
if (NULL != pWbemLocator)
{
pWbemLocator->Release();
}
if (NULL != pNameSpace)
{
pNameSpace->Release();
}
if (NULL != pEnum)
{
pEnum->Release();
}
if (NULL != pConfig)
{
pConfig->Release();
}
if (NULL != pRefresher)
{
pRefresher->Release();
}
CoUninitialize();
if (FAILED (hr))
{
wprintf (L"Error status=%08x\n",hr);
}
return 1;
}
Související témata
-
kvalifikátory vlastností pro formátované třídy počítadel výkonu