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

Ваш аккаунт

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

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

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

Как получить загрузку цп в процентах?

95K
20 декабря 2014 года
pokemonjke
1 / / 20.12.2014
Делаю программу-индикатор для курсача, нагрузка на цп и памяти. С памятью разобрался через MEMORYSTATUS. Подскажите как подсчитать нагрузку ЦП.
(По аналогии работает Гаджет в Win)
326
20 декабря 2014 года
sadovoya
757 / / 19.11.2005
Вроде как можно использовать API-функцию GetSystemTimes (не путайте с GetSystemTime). Обсуждалось уже на форуме здесь.
326
21 декабря 2014 года
sadovoya
757 / / 19.11.2005
Вот накропал на скорую руку, может поможет разобраться. Проверки ошибок возврата ф-ций и загрузки библиотеки опустил. Не уверен, что правильно вообще (например, перевод в double из структур и формула вычисления загрузки процессора). Судя по MSDN, время простоя входит во время ядра. Похоже на правду, судя по возвращаемым данным. Код делает единичный замер, удобней переделать в циклические. Короче, чем богаты..

Код:
#include <cstdio>
#include <windows.h>

typedef BOOL (__stdcall * GetSystemTimes_API_ptr)(LPFILETIME,LPFILETIME,LPFILETIME);

//Перевод в миллисекунды из FILETIME
//(надеюсь правильно, но надо проверить..)
double filetime2double_msec(FILETIME ft) {
    return 1e-4*((UINT64(ft.dwHighDateTime)<<32) + (UINT64)ft.dwLowDateTime);
}

int main () {
    FILETIME IdleTime1, IdleTime2, KernelTime1, KernelTime2, UserTime1, UserTime2;
    HINSTANCE hLib = LoadLibraryA("kernel32.dll");
    GetSystemTimes_API_ptr GetSystemTimes_API =
        (GetSystemTimes_API_ptr)GetProcAddress(hLib, "GetSystemTimes");
    GetSystemTimes_API(&IdleTime1, &KernelTime1, &UserTime1);
    Sleep(75);//Короткая пауза в программе между замерами.
    //Здесь 75 мсек (особой точностью Sleep не обладает, но нам тут не важно)
    GetSystemTimes_API(&IdleTime2, &KernelTime2, &UserTime2);
    FreeLibrary(hLib);

    printf("IdleTime2 - IdleTime1 = %f msec\n", filetime2double_msec(IdleTime2)
           - filetime2double_msec(IdleTime1));
    printf("KernelTime2 - KernelTime1 = %f msec\n",
           filetime2double_msec(KernelTime2) - filetime2double_msec(KernelTime1));
    printf("UserTime2 - UserTime1 = %f msec\n",
           filetime2double_msec(UserTime2) - filetime2double_msec(UserTime1));

    //Судя по описанию (http://msdn.microsoft.com/en-us/library/ms724400(VS.85).aspx)
    //Kernel Time включает и время простоя, поэтому полное время и чистое занятое:
    double Overall = filetime2double_msec(KernelTime2) +
        filetime2double_msec(UserTime2) -
        filetime2double_msec(KernelTime1) -
        filetime2double_msec(UserTime1);
    double Busy = Overall -
        filetime2double_msec(IdleTime2) +
        filetime2double_msec(IdleTime1);

    //Процент занятости:
    double usage = 100.0*(Busy/Overall);

    printf("\nOverall = %f, msec\n", Overall);
    printf("Busy = %f, msec\n", Busy);
    printf("Usage = %f%%\n", usage);

    getchar();

    return 0;
}
260
21 декабря 2014 года
Ramon
1.1K / / 16.08.2003
К сожалению не могу не отметить адову помойность приведенного выше исходника. Начиная от динамической линковки времени исполнения, совершенно не нужно и привносящей только гору помойев с собой. Продолжая использованием плавающей точки которая здесь так же не имеет особого смысла. И заканчивая помесью с и с++.

В результате программа из четырех строк превращаятся в ведро помоев причем на пустом месте.
326
21 декабря 2014 года
sadovoya
757 / / 19.11.2005
Офигенно ценное замечание.
Динамическая линковка, ибо не у всех студия.
Плавающая точка тут легчайший выход.
Насчет Си и C++ бообще бред.
260
21 декабря 2014 года
Ramon
1.1K / / 16.08.2003
Отчего вы тогда не использовали динамическую линковку времени исполнения и для ф-ции Sleep, расположенной так же в kernel32?
Динамическая линковка и студия/не студия друг к другу отношения не имеют.
Разве что самый лёгкий способ заняться странным.
Используем cstdio и в тоже самое время вызываем ф-ции стандартной библиотеки вне пространства имён. И используем преобразование типов посредством создания объекта ( UINT64(ft.dwHighDateTime) ). Это всё бред, да.

Впрочем о чём это йа и главное зачем.
Приятного вечера.
327
21 декабря 2014 года
UserNet2008
748 / / 03.04.2010
БРАВО(+1) Ramon я тоже печатал про sadovoya сдесъ
ВАЖНО И ОЧЕНЪ ЕСТЪ ОПАСТНО - Есть специальные скрипты типа для железа. Как и что вы сами думайте, дело есть серъёзное.
P/S
Лучше в ларёк и 2 пива и голову не ломать - пока комп не спалишъ.
326
21 декабря 2014 года
sadovoya
757 / / 19.11.2005
UINT64 это вообще-то unsigned long long всего то навсего.
Sleep, как и LoadLibrary, FreeLibrary, GetProcAddress есть всегда при самых даже куцых реализациях заголовочников. А GetSystemTimes, например, в MinGW забыта.
С пространством имен в таких крохотных программах можно не сильно морочиться. Но с этим замечанием все ж могу согласиться отчасти.
260
21 декабря 2014 года
Ramon
1.1K / / 16.08.2003
Function-style casts, в данном случае это по сути создание временного объекта типа UINT64 с инициализацией его значением ft.dwHighDateTime. Этих типов приведения нет в C.
winbase.h:2195 (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
Можно "не морочиться", однако этот исходник не обязан даже компилироваться, особенно, если используется стандартная библиотека более-менее соответствующая стандарту C++.
326
21 декабря 2014 года
sadovoya
757 / / 19.11.2005
Да, дефайн я проморгал. Можно использовать GetSystemTimes. Для этого такие инклюды и дефайны:

 
Код:
#include <cstdio>

#define _WIN32_WINNT  0x0501 //как минимум

#include <windows.h>
#include <winbase.h>
Про UINT64 я вроде ответил.

Код спокойно компилируется с указанием gcc строго следовать стандарту С++11 (или даже C++98 - во что там раскрывается UINT64 до конца не прокопал; unsigned long long он при этом уже быть не может ибо такого встроенного типа еще не было). А спокойней все-таки переписать ф-цию в явном виде через unsigned long long:

 
Код:
double filetime2double_msec(FILETIME ft) {
    return 1e-4*( (((unsigned long long)ft.dwHighDateTime)<<32) +
                  (unsigned long long)ft.dwLowDateTime );
}
И ограничиться компиляцией с поддержкой С++11 и выше.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог