Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В чём может быть ошибка?

5.7K
18 августа 2011 года
Lindemann66
193 / / 21.07.2011
Всем привет!
Вот 2ой день разбираюсь с CpuUsage (Qt + WinApi)
Наконец-то при сборке нет ошибок
Но толку мало
Есть код:
Код:
//
//    The performance data is accessed through the registry key
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data,
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key
//    causes the system to collect the data from the appropriate system
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex, DWORD dwCounterIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);

    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    char keyName[32];
    sprintf(keyName,"%d",dwObjectIndex);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                          keyName,
                          NULL,
                          NULL,
                          Buffer,
                          &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.

        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}

В Visual Studio он выполняется, само собой, корректно, и в результате выполнения
pPerfData->TotalByteLength = 1232
и
pPerfData->NumObjectTypes = 1
Как и должно быть
Чтобы этот код работал в Qt, я его немного подправил:
Код:
//
//    The performance data is accessed through the registry key
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data,
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key
//    causes the system to collect the data from the appropriate system
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);
 
    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()];
    str.toWCharArray(keyName);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                           keyName,
                           NULL,
                           NULL,
                           Buffer,
                           &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.
        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}

В итоге, код стал отрабатывать неправильно
Важные значения
pPerfData->TotalByteLength = 104
и
pPerfData->NumObjectTypes = 0
Через Watch смотрел все переменные - значения те же
НО - работает по-другому

Может кто-то может сказать, что я в чём-то ошибся, или что-то сделал некорректно?
Буду благодарен за любые советы!
277
18 августа 2011 года
arrjj
1.7K / / 26.01.2011
Попробуй
Код:
#ifndef Q_OS_WIN
#error Windows only
#endif
//
//    The performance data is accessed through the registry key
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data,
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key
//    causes the system to collect the data from the appropriate system
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);
 
    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    QString str = QString::number(dwObjectIndex);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                           (wchar_t*)str.utf16(),
                           NULL,
                           NULL,
                           Buffer,
                           &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.
        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}

Или
Код:
#ifndef Q_OS_WIN
#error Windows only
#endif
//
//    The performance data is accessed through the registry key
//    HKEY_PEFORMANCE_DATA.
//    However, although we use the registry to collect performance data,
//    the data is not stored in the registry database.
//    Instead, calling the registry functions with the HKEY_PEFORMANCE_DATA key
//    causes the system to collect the data from the appropriate system
//    object managers.
//
//    QueryPerformanceData allocates memory block for getting the
//    performance data.
//
//
void QueryPerformanceData(PERF_DATA_BLOCK **pPerfData, DWORD dwObjectIndex) {
    //
    // Since i want to use the same allocated area for each query,
    // i declare CBuffer as static.
    // The allocated is changed only when RegQueryValueEx return ERROR_MORE_DATA
    //
    static CBuffer Buffer(TOTALBYTES);
 
    DWORD BufferSize = Buffer.GetSize();
    LONG lRes;

    QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()+1];
    keyName[str.length()] = 0;
    str.toWCharArray(keyName);

    Buffer.Reset();
    while( (lRes = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                           keyName,
                           NULL,
                           NULL,
                           Buffer,
                           &BufferSize )) == ERROR_MORE_DATA ) {
        // Get a buffer that is big enough.
        BufferSize += BYTEINCREMENT;
        Buffer.Realloc(BufferSize);
    }
    *pPerfData = (PPERF_DATA_BLOCK) Buffer.m_pBuffer;
}

И чему у тебя равно TOTALBYTES?
5.7K
18 августа 2011 года
Lindemann66
193 / / 21.07.2011
ДА! Я как раз так же написал, как и ты, и это кусок заработал:)
Спасибо большое, прям респект тебе:)
1
18 августа 2011 года
kot_
7.3K / / 20.01.2000
Я бы обратил внимание на этот фрагмент кода.
 
Код:
QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()];
    str.toWCharArray(keyName);

Вероятно читаются не те данные.
5.7K
18 августа 2011 года
Lindemann66
193 / / 21.07.2011
Ну всё, вопрос решён
Дело был в том, что не проставлял завершающий 0
 
Код:
QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length()];
    str.toWCharArray(keyName);

В итоге получилось:
 
Код:
QString str = QString::number(dwObjectIndex);
    wchar_t* keyName = new wchar_t[str.length() + 1];

    str.toWCharArray(keyName);
    keyName[str.length()] = '\0';
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог