как прочитать счетчик Windows Perfmon?

Могу ли я получить код C++ для чтения счетчика производительности Windows (категория, имя счетчика и имя экземпляра)?

Это очень просто на С#, но мне нужен был код на С++.

Спасибо


person RedFox    schedule 08.06.2012    source источник
comment
Посмотрите запись в блоге моего друга. Мы используем этот код для некоторых внутренних инструментов. askldjd.wordpress.com/2011/01/05 /a-pdh-helper-class-cpdhquery   -  person Doug T.    schedule 08.06.2012
comment
Спасибо, но я ищу код для чтения только одного значения счетчика. Я не хочу запрашивать подстановочные знаки. например, мне нужно считать следующий счетчик \\Processor Information(_Total)\% процессорного времени   -  person RedFox    schedule 08.06.2012


Ответы (2)


Как указывал ранее Дуг Т., некоторое время назад я опубликовал вспомогательный класс для запроса значения счетчика производительности. Использование класса довольно простое, все, что вам нужно сделать, это указать строку для счетчика производительности. http://askldjd.wordpress.com/2011/01/05/a-pdh-helper-class-cpdhquery/

Однако код, который я разместил в своем блоге, на практике был изменен. Из вашего комментария кажется, что вы заинтересованы в запросе только одного поля.

В этом случае попробуйте добавить следующую функцию в мой класс CPdhQuery.

double CPdhQuery::CollectSingleData()
{
    double data = 0;
    while(true)
    {
        status = PdhCollectQueryData(hQuery);

        if (ERROR_SUCCESS != status)
        {
            throw CException(GetErrorString(status));
        }

        PDH_FMT_COUNTERVALUE cv;
        // Format the performance data record.
        status = PdhGetFormattedCounterValue(hCounter,
            PDH_FMT_DOUBLE,
            (LPDWORD)NULL,
            &cv);

        if (ERROR_SUCCESS != status)
        {
            continue;
        }

        data = cv.doubleValue;

        break;

    }

    return data;
}

Например, Чтобы получить процессорное время

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Processor Information(_Total)\% Processor Time")));

Чтобы получить байт чтения файла / сек:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\System\\File Read Bytes/sec")));

Чтобы получить% выделенных байтов:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Memory\\% Committed Bytes In Use")));

Чтобы получить данные, сделайте это.

double data = counter->CollectSingleData();

Надеюсь, это поможет.

... Алан

person askldjd    schedule 09.06.2012

Некоторые из часто используемых значений производительности имеют вызовы API для их прямого получения. Например, общее время процессора можно получить из GetSystemTimes, и вы можете рассчитать процент самостоятельно.

Если это невозможно, то данные о производительности Вспомогательная библиотека предоставляет довольно простой интерфейс для работы с данными о производительности.

person arx    schedule 08.06.2012