Perfmon: как получить непрерывную трассировку

Трассировка приведенного ниже кода полностью сломана, а не плавная кривая. Это фрагмент моей программы. Моя частота дискретизации составляет 1 секунду, и я перепробовал все возможные значения дискретизации. Я также пробовал приведенный ниже код, используя только PerfSetULongLongCounterValue() и не используя вызовы Decrement/Increment. Это тоже не помогло. Должен быть способ/настройка сообщить Perfmon, что, если входящее значение равно 100, 200, 300, 500, 300, 200, 100, отрисовывается синусоида. Когда я даю данные синусоидальной волны с интервалом в 1 секунду, я получаю несвязанные линии. Пожалуйста помоги.

PerfSetULongLongCounterValue(abcd, GPerfInstance0[0], TOT_MBW_ID, 0);
ULONGLONG counterValue = 0, oldCounterValue = 0;
SYSTEMTIME sysTime;
while (!_kbhit()) {
    counterValue = 30+ (rand() % 10)*100;
    if (counterValue > oldCounterValue) {
        PerfIncrementULongLongCounterValue(abcd, GPerfInstance0[0], TOT_MBW_ID, llabs(counterValue - oldCounterValue));
    } else if (counterValue < oldCounterValue) {
        PerfDecrementULongLongCounterValue(abcd, GPerfInstance0[0], TOT_MBW_ID, llabs(counterValue - oldCounterValue));
    } else {
        PerfSetULongLongCounterValue(abcd, GPerfInstance0[0], TOT_MBW_ID, counterValue);
    }
    GetSystemTime(&sysTime);
    cout << counterValue << ", " << sysTime.wMinute << ":" << sysTime.wSecond << "\n";
    oldCounterValue = counterValue;
    Sleep(1000);
}

Мне указали на этот образец кода: https://github.com/microsoft/Windows-classic-samples/blob/master/Samples/Win7Samples/winbase/PerfCounters/Basic/CPP/ucs.c Однако это работает отлично когда я попробовал тот же код в своем коде, PerfSetCounterRefValue() выдал ошибку 0x57 INVALID_PARAMETER. Поэтому я отказался от этого. По крайней мере, приведенный выше код работает гораздо лучше и нуждается в одной небольшой настройке. Любая помощь будет принята с благодарностью.


person Santhosh Kumar    schedule 03.12.2019    source источник


Ответы (1)


MSFT предоставляет образец кода здесь: https://github.com/microsoft/Windows-classic-samples/blob/master/Samples/Win7Samples/winbase/PerfCounters/Basic/CPP У этого примера есть одна проблема: я не смог получить PerfSetCounterRefValue() для Работа. Он жаловался на ERROR_INVALID_PARAMETER (0x57). Мой код не использует его. Другая проблема заключалась в использовании PerfSetULongLongCounterValue(), если я использую это вместо PerfIncrementULongLongCounterValue(), моя трассировка разрывается, не получая непрерывной трассировки.

Хорошо, наконец, я заработал. Это правильный/официальный способ? Я не знаю. В моем случае он работает нормально и точно отслеживает переданное ему значение.

ULONGLONG initValue = 0;
ULONGLONG currentValue = 0;
SYSTEMTIME sysTime;
PerfSetULongLongCounterValue(HandleX, PerfInstance, 1, initValue);

while (!_kbhit()) {
    currentValue = (rand() % 10)*100;
    GetSystemTime(&sysTime);
    PerfIncrementULongLongCounterValue(HandleX, PerfInstance, 1, currentValue);
    cout << sysTime.wMinute << ":" << sysTime.wSecond << " " << currentValue << "\n";
    Sleep(1000);
}
return 0;
person Santhosh Kumar    schedule 10.12.2019