Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/82: Рейтинг темы: голосов - 82, средняя оценка - 4.99
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43

Как узнать загрузку ЦП для многоядерных ЦП?

26.11.2012, 21:35. Показов 17323. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Долго рылся в инете но так ничего толкового и не нашел. Нужно чтоб программа работала под всеми основными платформами (xp, win7, x86, x64) и выдавала значения: количество ядер и загруженность каждого ядра.
Это в первую очередь, еще нужно читать обьем и загруженность оперативки и виртуалки отдельно. И еще нужно (хотя это уже неочень обьязательно) снимать показания с любого из датчиков температуры процессора(желательно с внутреннего, и чтоб работало на любом ЦП)
Лучше наверное загрузку ЦП читать с реестра?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2012, 21:35
Ответы с готовыми решениями:

как узнать загрузку мк
собственно в этом вопрос программирую в авр студии функции такой не нашел как узнать насколько загружен мк?

Как узнать что WinSock закончил загрузку файла?
Здравствуйте! Наверняка, все кто начинали работать с winsock спрашивали о том-же, что и я сейчас хочу спросить. 1. Моя программа...

Как узнать текущую загрузку процессора, памяти и сети?
Подскажите, как узнать текущую нагрузку на процессор, загрузку памяти, интернет-канала через cmd?

49
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
27.11.2012, 16:54
Цитата Сообщение от зукс Посмотреть сообщение
Лучше наверное загрузку ЦП читать с реестра?
А есть еще другие способы?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
27.11.2012, 17:16
C++
1
2
3
    _SYSTEM_INFO asd;
    GetSystemInfo(&asd);
    Memo1->Lines->Add(asd.dwNumberOfProcessors);
ну и дальше рыть в эту сторону

GetSystemInfo()
CreateToolhelp32Snapshot()
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
27.11.2012, 19:24  [ТС]
Цитата Сообщение от mimicria Посмотреть сообщение
А есть еще другие способы?
Ну типа через API
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
27.11.2012, 19:41
Цитата Сообщение от Gremlin Посмотреть сообщение
C++
1
_SYSTEM_INFO asd; GetSystemInfo(&asd);
А что в структуре SYSTEM_INFO показывает загрузку процессора?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
27.11.2012, 19:59
mimicria,
_SYSTEM_INFO - тут можно полуить архетектуру процессора, сколько ядер, ревизию...
CreateToolhelp32Snapshot - тут можно узнать сколько процессов запущено, сколько ресурсов кушает каждый из них (например у диспетчера задач вкладка Процессы составляется из CreateToolhelp32Snapshot...)

к слову, это WINAPI ф-ции, подробное описание есть на MSDN
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
27.11.2012, 21:09  [ТС]
mimicria, а как узнать загрузку каждого ядра?
Нашел вот такой вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nowtime = GetTickCount();
        pertime = nowtime - oldtime;
        oldtime = nowtime;
 
        func(SystemProcessorTimes,
              &CurrentSysProcTimes[0],
              sizeof(CurrentSysProcTimes),
              &rez);
 
        __int64 temp = 0;
 
        for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp += CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
        }
        temp /= 10000;
        temp /= GetProcessorsCount();
 
        temp = pertime - temp;
Правда не совсем понимаю как тут узнать загрузку каждого ядра?
Эта прога выдает суммарную загрузку всех ядер

Я так понимаю переменная pertime содержит в себе время между вызовами функции?

Если я напишу вместо:
C++
1
2
3
4
for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp += CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
        }
Такое:
C++
1
2
3
4
for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp[j] = CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
        }
Я узнаю загрузку каждого проца отдельно?

Добавлено через 15 минут
Заработало когда написал вот так (может кому пригодится):
C++
1
2
3
4
5
6
7
8
9
 __int64 temp[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
        for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp[j] = CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
            temp[j] /= 10000;
            temp[j] = pertime - temp[j];
            temp[j] = temp[j]/(float)pertime*100;
        }
Добавлено через 1 минуту
прога рассчитана максимум на 16 ядер

Добавлено через 14 минут
вот весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
       #include "iostream.h"
#include "windows.h"
 
#define SystemProcessorTimes 8
#define MAX_PROCESSORS 32
typedef struct _SYSTEM_BASIC_INFORMATION
{
    ULONG Unknown,
    MaximumIncrement,
    PhysicalPageSize,
    NumberOfPhysicalPages,
    LowestPhysicalPage,
    HighestPhysicalPage,
    AllocationGranularity,
    LowestUserAddress,
    HighestUserAddress,
    ActiveProcessors;
    char NumberProcessors;
}SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
 
typedef struct _SYSTEM_PROCESSOR_TIMES
{
    __int64 IdleTime,
    KernelTime,
    UserTime,
    DpcTime,
    InterruptTime;
    ULONG InterruptCount;    
} SYSTEM_PROCESSORS_TIMES[MAX_PROCESSORS], SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES;
 
typedef UINT __stdcall (*ZwQuerySystemInformation)(DWORD,void*,DWORD,DWORD*);
 
int GetProcessorsCount(void)
{
  SYSTEM_INFO SYSINFO;
  GetSystemInfo(&SYSINFO);
  return SYSINFO.dwNumberOfProcessors;
}
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 int i = -1;
    HMODULE lib = NULL;
    DWORD nowtime, oldtime, pertime, rez;
    SYSTEM_PROCESSORS_TIMES CurrentSysProcTimes, PreviousSysProcTimes;
 
    ZeroMemory(&CurrentSysProcTimes[0],sizeof(CurrentSysProcTimes));
    ZeroMemory(&PreviousSysProcTimes[0],sizeof(PreviousSysProcTimes));
 
    lib = LoadLibrary("Ntdll.dll");
 
 
    ZwQuerySystemInformation func =
               (ZwQuerySystemInformation)GetProcAddress(lib,"ZwQuerySystemInformation");
 
 
    oldtime =  GetTickCount();
    Sleep(50);
 
    i = 10;
    for(i=10;i>1;i--)
    {
        nowtime = GetTickCount();
        pertime = nowtime - oldtime;
        oldtime = nowtime;
 
        func(SystemProcessorTimes,
              &CurrentSysProcTimes[0],
              sizeof(CurrentSysProcTimes),
              &rez);
 
        __int64 temp[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
        for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp[j] = CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
            temp[j] /= 10000;
            temp[j] = pertime - temp[j];
            temp[j] = temp[j]/(float)pertime*100;
        }
        memcpy(&PreviousSysProcTimes[0],
                &CurrentSysProcTimes[0],
                sizeof(PreviousSysProcTimes));
        Sleep(20);
        Form1->Edit2->Text = temp[0];
        Form1->Edit3->Text = temp[1];
        Form1->Edit4->Text = temp[2];
        Form1->Edit5->Text = temp[3];
    }
Form1->Edit1->Text = GetProcessorsCount();
 
}
Только вот меня напрягают две строки задержек Sleep. При этом программа постоянно подвисает на них. Убрать их нельзя... Можно чтото сделать чтоб программа н еподвисала на задержках? (заменить их чемто)
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
27.11.2012, 21:30
Цитата Сообщение от зукс Посмотреть сообщение
Только вот меня напрягают две строки задержек Sleep. При этом программа постоянно подвисает на них. Убрать их нельзя... Можно чтото сделать чтоб программа н еподвисала на задержках? (заменить их чемто)
вывести данный код в поток (THread)
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
27.11.2012, 21:32  [ТС]
Gremlin, а как это сделать? Я не совсем понимаю...
Думал как вариант разбить код на 3 куска (куски между задержками) поместить их в 3 таймера и по событиям поочереди включать и выключать таймеры (хотя как по мне это туповатая идея)
0
12 / 12 / 9
Регистрация: 12.04.2012
Сообщений: 259
28.11.2012, 07:55
C++
1
#include "process.h"
C++
1
2
3
4
5
6
unsigned __stdcall Thread( void* Param ) 
{
//Тут твой код
_endthreadex( 0 );
return 0;
}
C++
1
2
3
4
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 _beginthreadex( NULL, 0, &Thread,(void *)0, 0,0); //создаем поток
}
1
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
28.11.2012, 07:57  [ТС]
С этим разобрался, спасибо. Как теперь узнать загрузку и обьем оперативы и виртуалки?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
28.11.2012, 10:54
что такое "оператива" и что такое "виртуалка" ?
0
 Аватар для Oxotnuk
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
28.11.2012, 13:34
Ну наверное ОЗУ и Свап
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
28.11.2012, 18:21  [ТС]
LK, оперативная память и виртуальная, та что выделяется на физическом диске. Так как узнать загрузку и обьем первого и второго? (для начала хотябы пока ОЗУ)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.11.2012, 00:59
Исследование виртуальной памяти
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
29.11.2012, 02:36  [ТС]
С памятью разобрался:
C++
1
2
3
4
5
6
7
8
9
  MEMORYSTATUSEX statex;
 
  statex.dwLength = sizeof (statex);
 
  GlobalMemoryStatusEx (&statex);
  pdata.memtotal=(statex.ullTotalPhys)/1048576;
  pdata.memaval=(statex.ullAvailPhys)/1048576;
  pdata.memvirttotal=(statex.ullTotalVirtual)/1048576;
  pdata.memvirtaval=(statex.ullAvailVirtual)/1048576;
Осталось самое сложное: Определение температуры процессора...
Как можно определить температуру ЦП чтоб работало на всех процессорах и материнках? Может както через биос или APM? Кто знает?
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
30.11.2012, 19:33  [ТС]
leva, можно както определить выполняется ли на данный момент поток или нет? Ато после добавления кода в поток у меня теряются пакеты передачи данных на USB и проходит только первая часть данных (а их много). На середине выполнения передачи поток запускается сново и программа не успевает выполнятся до конца
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
04.12.2012, 16:59  [ТС]
GlobalMemoryStatusEx неправильно меряет виртуальную память. Чем ее мерять чтоб правильно показывало?
0
4 / 4 / 1
Регистрация: 06.05.2013
Сообщений: 86
09.05.2013, 18:04
Цитата Сообщение от зукс Посмотреть сообщение
mimicria, а как узнать загрузку каждого ядра?


Добавлено через 14 минут
вот весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
 
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
       #include "iostream.h"
#include "windows.h"
 
#define SystemProcessorTimes 8
#define MAX_PROCESSORS 32
typedef struct _SYSTEM_BASIC_INFORMATION
{
    ULONG Unknown,
    MaximumIncrement,
    PhysicalPageSize,
    NumberOfPhysicalPages,
    LowestPhysicalPage,
    HighestPhysicalPage,
    AllocationGranularity,
    LowestUserAddress,
    HighestUserAddress,
    ActiveProcessors;
    char NumberProcessors;
}SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
 
typedef struct _SYSTEM_PROCESSOR_TIMES
{
    __int64 IdleTime,
    KernelTime,
    UserTime,
    DpcTime,
    InterruptTime;
    ULONG InterruptCount;    
} SYSTEM_PROCESSORS_TIMES[MAX_PROCESSORS], SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES;
 
typedef UINT __stdcall (*ZwQuerySystemInformation)(DWORD,void*,DWORD,DWORD*);
 
int GetProcessorsCount(void)
{
  SYSTEM_INFO SYSINFO;
  GetSystemInfo(&SYSINFO);
  return SYSINFO.dwNumberOfProcessors;
}
 
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 int i = -1;
    HMODULE lib = NULL;
    DWORD nowtime, oldtime, pertime, rez;
    SYSTEM_PROCESSORS_TIMES CurrentSysProcTimes, PreviousSysProcTimes;
 
    ZeroMemory(&CurrentSysProcTimes[0],sizeof(CurrentSysProcTimes));
    ZeroMemory(&PreviousSysProcTimes[0],sizeof(PreviousSysProcTimes));
 
    lib = LoadLibrary("Ntdll.dll");
 
 
    ZwQuerySystemInformation func =
               (ZwQuerySystemInformation)GetProcAddress(lib,"ZwQuerySystemInformation");
 
 
    oldtime =  GetTickCount();
    Sleep(50);
 
    i = 10;
    for(i=10;i>1;i--)
    {
        nowtime = GetTickCount();
        pertime = nowtime - oldtime;
        oldtime = nowtime;
 
        func(SystemProcessorTimes,
              &CurrentSysProcTimes[0],
              sizeof(CurrentSysProcTimes),
              &rez);
 
        __int64 temp[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
        for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp[j] = CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
            temp[j] /= 10000;
            temp[j] = pertime - temp[j];
            temp[j] = temp[j]/(float)pertime*100;
        }
        memcpy(&PreviousSysProcTimes[0],
                &CurrentSysProcTimes[0],
                sizeof(PreviousSysProcTimes));
        Sleep(20);
        Form1->Edit2->Text = temp[0];
        Form1->Edit3->Text = temp[1];
        Form1->Edit4->Text = temp[2];
        Form1->Edit5->Text = temp[3];
    }
Form1->Edit1->Text = GetProcessorsCount();
 
}
Только вот меня напрягают две строки задержек Sleep. При этом программа постоянно подвисает на них. Убрать их нельзя... Можно чтото сделать чтоб программа н еподвисала на задержках? (заменить их чемто)


Странно, у меня выбивает ошибку
[bcc32 Error] Unit1.cpp(65): E2141 Declaration syntax error
Unit1.cpp(62): parsing: unsigned int __stdcall Thread(void *)
0
10 / 10 / 1
Регистрация: 26.11.2012
Сообщений: 43
09.05.2013, 18:13  [ТС]
burnthemeat, у меня этот код больше полу года стабильно работает. Правда я его немного подправил. Дело скорей всего в компиляторе. Какая версия билдера?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2013, 18:13
Помогаю со студенческими работами здесь

Написание программ для многоядерных процессоров
Привет. у вас на сайте я видел такую статью, но теперь когда она мне понадобилась, не могу ее найти. так вот: как писать программы для...

Активация ядер процессора в Windows 7 (для многоядерных проц)
Когда был 2-X ядерный проц, видел, как наладчик активировал при настройке windows 7 - 2 ядра, но я забыл, где именно в настройках он это...

Узнать загрузку ядра ?
Добрый день ! Простите за ламерский вопрос, но всё же... Как узнать загрузку ядер процессора ? топ не подходит... Олег.

Узнать загрузку процессора программой
Добрый день! Подскажите, кто уже решал подобную задачу. Как узнать процент загрузки процессора данной программой? Добавлено через...

Нужно узнать загрузку ЦП, оперативной память и дискового пространства
Всем привет, хочу собрать информацию про загрузку ЦП, оперативной память и дискового пространства всей операционной системы(ЭТО ВАЖНО)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru