Как получить загрузку цп в процентах?
(По аналогии работает Гаджет в Win)
Вроде как можно использовать API-функцию GetSystemTimes (не путайте с GetSystemTime). Обсуждалось уже на форуме
Код:
#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;
}
#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;
}
В результате программа из четырех строк превращаятся в ведро помоев причем на пустом месте.
Динамическая линковка, ибо не у всех студия.
Плавающая точка тут легчайший выход.
Насчет Си и C++ бообще бред.
Динамическая линковка и студия/не студия друг к другу отношения не имеют.
Разве что самый лёгкий способ заняться странным.
Используем cstdio и в тоже самое время вызываем ф-ции стандартной библиотеки вне пространства имён. И используем преобразование типов посредством создания объекта ( UINT64(ft.dwHighDateTime) ). Это всё бред, да.
Впрочем о чём это йа и главное зачем.
Приятного вечера.
сдесъ
ВАЖНО И ОЧЕНЪ ЕСТЪ ОПАСТНО - Есть специальные скрипты типа для железа. Как и что вы сами думайте, дело есть серъёзное.
P/S
Лучше в ларёк и 2 пива и голову не ломать - пока комп не спалишъ.
БРАВО(+1) Ramon я тоже печатал про sadovoya
ВАЖНО И ОЧЕНЪ ЕСТЪ ОПАСТНО - Есть специальные скрипты типа для железа. Как и что вы сами думайте, дело есть серъёзное.
P/S
Лучше в ларёк и 2 пива и голову не ломать - пока комп не спалишъ.
Sleep, как и LoadLibrary, FreeLibrary, GetProcAddress есть всегда при самых даже куцых реализациях заголовочников. А GetSystemTimes, например, в MinGW забыта.
С пространством имен в таких крохотных программах можно не сильно морочиться. Но с этим замечанием все ж могу согласиться отчасти.
winbase.h:2195 (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
Можно "не морочиться", однако этот исходник не обязан даже компилироваться, особенно, если используется стандартная библиотека более-менее соответствующая стандарту C++.
Код:
#include <cstdio>
#define _WIN32_WINNT 0x0501 //как минимум
#include <windows.h>
#include <winbase.h>
#define _WIN32_WINNT 0x0501 //как минимум
#include <windows.h>
#include <winbase.h>
Код спокойно компилируется с указанием 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 );
}
return 1e-4*( (((unsigned long long)ft.dwHighDateTime)<<32) +
(unsigned long long)ft.dwLowDateTime );
}