Como recuperar o valor de contador de desempenho usando PDH

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 287158
Sumário
APIs do auxiliar de dados (PDH) de desempenho pode ser usadas para coletar dados de desempenho de vários contadores ou instâncias que estejam disponíveis no sistema. Este artigo demonstra as chamadas de API PDH são necessários para coletar dados de desempenho para um objeto de desempenho, contador e nome da instância.
Mais Informações
O código de exemplo abaixo possui uma tabela PDH_COUNTER_PATH_ELEMENTS CPE que especifica o objeto de desempenho, contador e nomes de instância para o qual o aplicativo está coletando os dados de desempenho.
#include <windows.h>#include <pdh.h>#include <stdio.h>BOOL WINAPI GetCounterValues(LPTSTR serverName);void main(int argc, char *argv[]){    if (argc > 1)    {        // argv[1] - Server Name        GetCounterValues(argv[1]);    }    else    {        // Local System        GetCounterValues(NULL);    }}BOOL WINAPI GetCounterValues(LPTSTR serverName){    PDH_STATUS s;    HQUERY hQuery;    // Array to specify the performance object, counter and instance for    // which performance data should be collected.    // typedef struct _PDH_COUNTER_PATH_ELEMENTS {    //   LPTSTR  szMachineName;    //   LPTSTR  szObjectName;    //   LPTSTR  szInstanceName;    //   LPTSTR  szParentInstance;    //   DWORD   dwInstanceIndex;    //   LPTSTR  szCounterName;    // } PDH_COUNTER_PATH_ELEMENTS, *PPDH_COUNTER_PATH_ELEMENTS;    // Each element in the array is a PDH_COUNTER_PATH_ELEMENTS structure.    PDH_COUNTER_PATH_ELEMENTS cpe[] =    {        { NULL, "Memory", NULL, NULL, -1, "Cache Bytes" },        { NULL, "Memory", NULL, NULL, -1, "Available Bytes" },        { NULL, "Processor", "_Total", NULL, -1, "% Processor Time" }    };    HCOUNTER hCounter[sizeof(cpe)/sizeof(cpe[0])];    char szFullPath[MAX_PATH];    DWORD cbPathSize;    int   i, j;    BOOL  ret = FALSE;    PDH_FMT_COUNTERVALUE counterValue;    // Only do this setup once.    if ((s = PdhOpenQuery(NULL, 0, &hQuery)) != ERROR_SUCCESS)    {        fprintf(stderr, "POQ failed %08x\n", s);        return ret;    }    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)    {        cbPathSize = sizeof(szFullPath);        cpe[i].szMachineName = serverName;        if ((s = PdhMakeCounterPath(&cpe[i],            szFullPath, &cbPathSize, 0)) != ERROR_SUCCESS)        {            fprintf(stderr,"MCP failed %08x\n", s);            return ret;        }        if (cpe[i].szInstanceName)        {            printf("Adding [%s\\%s\\%s]\n",                    cpe[i].szObjectName,                    cpe[i].szCounterName,                    cpe[i].szInstanceName);        }        else            printf("Adding [%s\\%s]\n",                    cpe[i].szObjectName,                    cpe[i].szCounterName);        if ((s = PdhAddCounter(hQuery, szFullPath, 0, &hCounter[i]))            != ERROR_SUCCESS)        {            fprintf(stderr, "PAC failed %08x\n", s);            return ret;        }    }    for (i = 0; i < 20; i++)    {        Sleep(100);        // Collect data as often as you need to.        if ((s = PdhCollectQueryData(hQuery)) != ERROR_SUCCESS)        {            fprintf(stderr, "PCQD failed %08x\n", s);            return ret;        }        if (i == 0) continue;        // Extract the calculated performance counter value for each counter or        // instance.        for (j = 0; j < sizeof(hCounter)/sizeof(hCounter[0]); j++)        {            if ((s = PdhGetFormattedCounterValue(hCounter[j], PDH_FMT_DOUBLE,                NULL, &counterValue)) != ERROR_SUCCESS)            {                fprintf(stderr, "PGFCV failed %08x\n", s);                continue;            }            if (cpe[j].szInstanceName)            {                printf("%s\\%s\\%s\t\t : [%3.3f]\n",                    cpe[j].szObjectName,                    cpe[j].szCounterName,                    cpe[j].szInstanceName,                    counterValue.doubleValue);            }            else                printf("%s\\%s\t\t : [%3.3f]\n",                    cpe[j].szObjectName,                    cpe[j].szCounterName,                    counterValue.doubleValue);        }    }    // Remove all the counters from the query.    for (i = 0; i < sizeof(hCounter)/sizeof(hCounter[0]); i++)    {        PdhRemoveCounter(hCounter[i]);    }    // Only do this cleanup once.    PdhCloseQuery(hQuery);    return TRUE;}				
Referências
APIs do PDH são implementadas no arquivo PDH.dll que acompanha o sistema operacional Microsoft Windows 2000 e Microsoft Windows XP. Para o sistema operacional Microsoft Windows NT 4.0, você pode baixar uma versão PDH.dll redistribuível separada.

Para obter informações adicionais sobre como obter a versão redistribuível do PDH.dll para Windows NT 4.0, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
284996ARQUIVO: Mais recente redistribuível PDH.dll disponível para Windows NT 4.0
Para obter informações adicionais sobre as APIs do PDH, consulte o tópico "Monitoramento de desempenho" na seção "Serviços de base" da biblioteca MSDN.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 287158 - Última Revisão: 11/21/2006 15:35:59 - Revisão: 3.3

Interface de Programação de Aplicativos do Microsoft Win32

  • kbmt kbapi kbhowto kbkernbase kbperfmon KB287158 KbMtpt
Comentários