Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/41: Рейтинг темы: голосов - 41, средняя оценка - 4.68
 Аватар для wakamon
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14

Как получить загруженность ЦП в процентах

19.12.2014, 18:46. Показов 8374. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пишу программу-индикатор для курсача, который определял бы загруженность памяти и процессора. Принцип работу как у Гаджета на рабочем столе. С памятью разобрался:
C++
1
2
3
4
5
6
MEMORYSTATUSEX stats;
stats.dwLength = sizeof(stats);
GlobalMemoryStatusEx(&stats);
__int64 a;
a=stats.dwMemoryLoad;
RichEdit1->Lines->Add(IntToStr(a)+"%");
А с загруженностью процессора не получается. Подскажите, может можно так же сделать, через структуры?
Или как то мониторить реестр??? (если так можно)
Изображения
 
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2014, 18:46
Ответы с готовыми решениями:

Получить загруженность процессора для определенной программы
Здравствуйте, подскажите как получить загруженность памяти и процессора моей программы? Хочу проверить как разные настройки программы...

Как узнать загруженность процессора, памяти и заряд батареи?
Как узнать насколько загружен процессор и оперативная память, а также заряд аккумулятора в ноутбуке?

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

8
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
20.12.2014, 00:13
Про реестр пишут, что данные получаются не верные на НЕ "древних" ОС.
А код гуглится за пару секунд (но на дельфи). Вроде как рабочий.
Delphi
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
const
  SystemBasicInformation = 0;
  SystemPerformanceInformation = 2;
  SystemTimeInformation = 3;
 
type
  TPDWord = ^DWORD;
 
  TSystem_Basic_Information = packed record
    dwUnknown1: DWORD;
    uKeMaximumIncrement: ULONG;
    uPageSize: ULONG;
    uMmNumberOfPhysicalPages: ULONG;
    uMmLowestPhysicalPage: ULONG;
    uMmHighestPhysicalPage: ULONG;
    uAllocationGranularity: ULONG;
    pLowestUserAddress: Pointer;
    pMmHighestUserAddress: Pointer;
    uKeActiveProcessors: ULONG;
    bKeNumberProcessors: byte;
    bUnknown2: byte;
    wUnknown3: word;
  end;
 
type
  TSystem_Performance_Information = packed record
    liIdleTime: LARGE_INTEGER; {LARGE_INTEGER}
    dwSpare: array[0..75] of DWORD;
  end;
 
type
  TSystem_Time_Information = packed record
    liKeBootTime: LARGE_INTEGER;
    liKeSystemTime: LARGE_INTEGER;
    liExpTimeZoneBias: LARGE_INTEGER;
    uCurrentTimeZoneId: ULONG;
    dwReserved: DWORD;
  end;
 
var
  NtQuerySystemInformation: function(infoClass: DWORD;
    buffer: Pointer;
    bufSize: DWORD;
    returnSize: TPDword): DWORD; stdcall = nil;
 
  liOldIdleTime: LARGE_INTEGER = ();
  liOldSystemTime: LARGE_INTEGER = ();
 
function Li2Double(x: LARGE_INTEGER): Double;
begin
  Result := x.HighPart * 4.294967296E9 + x.LowPart
end;
 
procedure GetCPUUsage;
var
  SysBaseInfo: TSystem_Basic_Information;
  SysPerfInfo: TSystem_Performance_Information;
  SysTimeInfo: TSystem_Time_Information;
  status: Longint; {long}
  dbSystemTime: Double;
  dbIdleTime: Double;
 
  bLoopAborted: boolean;
 
begin
  if @NtQuerySystemInformation = nil then
    NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
      'NtQuerySystemInformation');
 
  // get number of processors in the system
 
  status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo,
    SizeOf(SysBaseInfo), nil);
  if status <> 0 then
    Exit;
 
  // Show some information
  with SysBaseInfo do
  begin
    ShowMessage(
      Format('uKeMaximumIncrement: %d'#13'uPageSize: %d'#13   +
      'uMmNumberOfPhysicalPages: %d' + #13 + 'uMmLowestPhysicalPage: %d' + #13 +
      'uMmHighestPhysicalPage: %d' + #13 + 'uAllocationGranularity: %d'#13 +
      'uKeActiveProcessors: %d'#13'bKeNumberProcessors: %d'  ,
      [uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages,
      uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity,
        uKeActiveProcessors, bKeNumberProcessors]));
  end;
 
  bLoopAborted := False;
 
  while not bLoopAborted do
  begin
 
    // get new system time
    status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo,
      SizeOf(SysTimeInfo), 0);
    if status <> 0 then
      Exit;
 
    // get new CPU's idle time
    status := NtQuerySystemInformation(SystemPerformanceInformation,
      @SysPerfInfo, SizeOf(SysPerfInfo), nil);
    if status <> 0 then
      Exit;
 
    // if it's a first call - skip it
    if (liOldIdleTime.QuadPart <> 0) then
    begin
 
      // CurrentValue = NewValue - OldValue
      dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) -
        Li2Double(liOldIdleTime);
      dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) -
        Li2Double(liOldSystemTime);
 
      // CurrentCpuIdle = IdleTime / SystemTime
      dbIdleTime := dbIdleTime / dbSystemTime;
 
      // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
      dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors
        + 0.5;
 
      // Show Percentage
      Form1.Label1.Caption := FormatFloat('CPU Usage: 0.0 %', dbIdleTime);
 
      Application.ProcessMessages;
 
      // Abort if user pressed ESC or Application is terminated
      bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or
        Application.Terminated;
 
    end;
 
    // store new CPU's idle and system time
    liOldIdleTime := SysPerfInfo.liIdleTime;
    liOldSystemTime := SysTimeInfo.liKeSystemTime;
 
    // wait one second
    Sleep(1000);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetCPUUsage
end;
1
 Аватар для wakamon
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
20.12.2014, 10:50  [ТС]
Спасибо за код, но мне не совсем понятень delphi. Можете помочь перевести это дело?
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
20.12.2014, 12:30
Пример тут Загрузка ЦП
0
 Аватар для wakamon
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
21.12.2014, 01:44  [ТС]
Воспользовавшись интернетом,свободным временем,информации с форума и нервами, попытался смастерить программу. В итоге получилось так что программа выдает очень большие результаты нагрузки. Я не совсем понимаю где я ошибся.
Вот код:

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
#include <iostream>
//#include <string.h>
#include <vcl.h>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
#include <ImgList.hpp>
#include <Menus.hpp>
#include <StdCtrls.hpp>
#define SystemProcessorTimes 8
#define MAX_PROCESSORS 32
 
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
 
 
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*);
 
SYSTEM_INFO SYSINFO;
 
int GetProcessorsCount(void)
{
  SYSTEM_INFO SYSINFO;
  GetSystemInfo(&SYSINFO);
  return SYSINFO.dwNumberOfProcessors;
}
 
 
 
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Color=clBlue;
TransparentColorValue=clBlue;
TransparentColor=true;
//Form1->Canvas->Brush->Color=clBlack;
//Form1->Canvas->Rectangle(10,10,20,20);
 
}
 
//---------------------------------------------------------------------------
int * cpu_usage;
__int64 temp = 0;
 unsigned int cycle_count = 0,
             count_mas = 0,
             interval = 1000;
 
 
HMODULE lib = NULL;
DWORD nowtime, oldtime, pertime, rez, curtime = 0;
SYSTEM_PROCESSORS_TIMES CurrentSysProcTimes, PreviousSysProcTimes;
 
ZwQuerySystemInformation func;
AnsiString msg = "";
 
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
cpu_usage = new int[100000];
   count_mas = 0;
 
 
 ZeroMemory(&CurrentSysProcTimes[0],sizeof(CurrentSysProcTimes));
    ZeroMemory(&PreviousSysProcTimes[0],sizeof(PreviousSysProcTimes));
 
    lib = LoadLibrary("Ntdll.dll");
 func = (ZwQuerySystemInformation)GetProcAddress(lib,"ZwQuerySystemInformation");
 
        nowtime = GetTickCount();
        pertime = nowtime - oldtime;
        curtime += pertime;
        oldtime = nowtime;
 
 
        func(SystemProcessorTimes,
              &CurrentSysProcTimes[0],
              sizeof(CurrentSysProcTimes),
              &rez);
 
      temp = 0;
       for(int j=0;j<MAX_PROCESSORS;j++)
       {
            temp += CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
 
       }
        temp /= 10000;
        temp /= (int) GetProcessorsCount();
 
        temp = (int) pertime - temp;
 
          if (cycle_count >= 1) {
 
        cpu_usage[count_mas] = temp / (float) pertime*100; }
 
        msg = "";
        msg += "Usage of processors is " + IntToStr(cpu_usage[count_mas]) + "%";
        Memo1->Lines->Add(msg);
        Memo1->Lines->Add("");
               Label5->Caption =IntToStr(cpu_usage[count_mas]);
        count_mas++;
 
 
           cycle_count++;
 
           memcpy(&PreviousSysProcTimes[0],
                &CurrentSysProcTimes[0],
                sizeof(PreviousSysProcTimes));
 
 
        Label2->Font->Color = clHighlight;
        Label2->Font->Size = 12;
        Label2->Font->Style=TFontStyles()<<fsBold;
 
RichEdit1->ReadOnly=false;
RichEdit1->Clear();
Timer1->Enabled;
Timer1->Interval=(1000);
 
 
 
MEMORYSTATUSEX stats;
stats.dwLength = sizeof(stats);
GlobalMemoryStatusEx(&stats);
__int64 a;
a=stats.dwMemoryLoad;
RichEdit1->Lines->Add(IntToStr(a)+" %");
 
Refresh ();
for (int i=0;i<a/10;i++)
     {
      if ((a>0)&&(a<=10)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>10)&&(a<=20)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>20)&&(a<=30)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>30)&&(a<=40)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>40)&&(a<=50)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>50)&&(a<=60)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>60)&&(a<=70)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}      if ((a>70)&&(a<=80)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>80)&&(a<=90)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      if ((a>90)&&(a<=100)) {Canvas->Brush->Color = RGB(25.5*i,255-25.5*i,0);Canvas->Rectangle(20,130-12*i,50,140-12*i);}
      }
}
 
//a=stats.ullTotalPhys;
//Memo1->Lines->Add(IntToStr(a)+"áàéò âñåé ôèçè÷åñêîé ïàìÿòè");
 
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{ //RichEdit1->Brush->Color=clBlue;
//TransparentColorValue=clBlue;
//TransparentColor=true;
 
Timer1->Enabled=true;
HideCaret(RichEdit1->Handle);
RichEdit1->Font->Color=clHighlight;
RichEdit1->Font->Style=TFontStyles()<<fsBold;
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close ();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button2MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    ReleaseCapture();
SendMessage(Form1->Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
//---------------------------------------------------------------------------
Делал по анологии как в этом посте.
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
21.12.2014, 15:27
Лучший ответ Сообщение было отмечено wakamon как решение

Решение

Да нормально работает, насчет загруженности не врет (график иногда прерывается, просто никогда раньше с PerformanceGraph вкладки Samples компонентов в билдере не работал):





Код не причесан (лень):
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "perfgrap"
#pragma resource "*.dfm"
 
#define SystemProcessorTimes 8
#define MAX_PROCESSORS 32
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
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*);
 
/*function*/
 
SYSTEM_INFO SYSINFO;
 
int GetProcessorsCount(void)
{
  SYSTEM_INFO SYSINFO;
  GetSystemInfo(&SYSINFO);
  return SYSINFO.dwNumberOfProcessors;
}
 
int GetProcessorType(SYSTEM_INFO& SYSINFO)
{
GetSystemInfo(&SYSINFO);
return SYSINFO.dwProcessorType;
}
 
int GetProcessorOemId(SYSTEM_INFO& SYSINFO)
{
GetSystemInfo(&SYSINFO);
return SYSINFO.dwOemId;
}
 
int * cpu_usage;
__int64 temp = 0;
unsigned int cycle_count = 0,
             count_mas = 0,
             interval = 1000; //период опроса (мс)
 
HMODULE lib = NULL;
DWORD nowtime, oldtime, pertime, rez, curtime = 0;
SYSTEM_PROCESSORS_TIMES CurrentSysProcTimes, PreviousSysProcTimes;
 
ZwQuerySystemInformation func;
 
String msg = "";
char * windowname = new char[20];
 
bool init = false;
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    strcpy(windowname,"CPU usage");
 
    ZeroMemory(&CurrentSysProcTimes[0],sizeof(CurrentSysProcTimes));
    ZeroMemory(&PreviousSysProcTimes[0],sizeof(PreviousSysProcTimes));
 
    lib = LoadLibrary(L"Ntdll.dll");   //динамическая загрузка библиотеки
 
    if (!lib)
    {
        msg = "Error #1: Не удалось динамически загрузить быблиотеку!";
        Application->MessageBox(msg.c_str(), L"Warning", MB_OK | MB_ICONERROR);
        return;
    }
 
    func = (ZwQuerySystemInformation)GetProcAddress(lib,"ZwQuerySystemInformation");  //запрос адреса функции
 
    if (!func)
    {
        msg = "Error #2: Не удалось получить адрес функции!";
        Application->MessageBox(msg.c_str(), L"Warning", MB_OK | MB_ICONERROR);
        FreeLibrary(lib);
        return;
    }
 
    Label1->Caption = "количество ядер : " + IntToStr(GetProcessorsCount()) + " / тип процессора : " + IntToStr(GetProcessorType(SYSINFO)) + " / OemId : " + IntToStr(GetProcessorOemId(SYSINFO));
    init = true;
    msg = "Инициализация успешна!";
    Application->MessageBox(msg.c_str(), (String(windowname)).c_str(), MB_OK | MB_ICONINFORMATION);
    Button1->Enabled = false;
    Button3->Enabled = true;
 
    cpu_usage = new int[100000];
    count_mas = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        nowtime = GetTickCount();
        pertime = nowtime - oldtime;
        curtime += pertime;
        oldtime = nowtime;
 
        /*read the usage*/
        func(SystemProcessorTimes,
              &CurrentSysProcTimes[0],
              sizeof(CurrentSysProcTimes),
              &rez);
 
        temp = 0;
        for(int j=0;j<MAX_PROCESSORS;j++)
        {
            temp += CurrentSysProcTimes[j].IdleTime - PreviousSysProcTimes[j].IdleTime;
        }
        temp /= 10000;  //переводим из наносекунд в миллисекунды
        temp /= (int) GetProcessorsCount(); //делим на количество ядер
 
        temp = (int) pertime - temp;
 
 
        if (cycle_count >= 1)
        {
        msg = "";
        msg += "Current time: " + String(curtime) + " milisecond(s). Processor usage on " + String(temp) + " milisecond.";
  //        Memo1->Lines->Add(msg);
 
 
        cpu_usage[count_mas] = temp / (float) pertime*100;
//      Edit4->Text = IntToStr(count_mas + 1);
 
        msg = "";
        msg += "Usage of processors is " + IntToStr(cpu_usage[count_mas]) + "%";
//      Memo1->Lines->Add(msg);
//      Memo1->Lines->Add("");
        Caption = msg;
        PerformanceGraph1->Scale += 1;
//      PerformanceGraph1->StepSize = 1;
 
        count_mas++;
        }
 
        cycle_count++;
//        Edit2->Text = IntToStr(cycle_count);
 
        memcpy(&PreviousSysProcTimes[0],
                &CurrentSysProcTimes[0],
                sizeof(PreviousSysProcTimes));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PerformanceGraph1ScaleChange(TObject *Sender)
{
  PerformanceGraph1->DataPoint(clLime, cpu_usage[count_mas]);
  PerformanceGraph1->Update();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Timer1->Enabled)
{
Timer1->Enabled = false;
 
//cycle_count = 0;
temp = 0;
curtime = 0;
oldtime = GetTickCount();
 
Button2->Enabled = false;
Button3->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (init)
{
    Button3->Enabled = false;
 
    /*init prev processors data*/
 
    //вызываем функцию по таймеру и один раз до запуска таймера.
    oldtime =  GetTickCount();
    if (func(SystemProcessorTimes,
              &PreviousSysProcTimes[0],
              sizeof(PreviousSysProcTimes),0) != 0)
    {
        msg = "Error #3: Ошибка функции!";
        Application->MessageBox(msg.c_str(), L"Warning", MB_OK | MB_ICONERROR);
        FreeLibrary(lib);
        return;
    }
 
Sleep(100);
cycle_count = 0;
 
Button2->Enabled = true;
 
Timer1->Interval = interval;
Timer1->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (lib) FreeLibrary(lib);
delete[] cpu_usage;
}
//---------------------------------------------------------------------------
Вложения
Тип файла: zip cpu_usage.zip (138.9 Кб, 83 просмотров)
2
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
21.12.2014, 15:58
С графиком разобрался: строку 181 нужно заменить на
C++
1
  PerformanceGraph1->DataPoint(clLime, cpu_usage[count_mas]+1);
0
 Аватар для wakamon
0 / 0 / 1
Регистрация: 11.12.2014
Сообщений: 14
22.12.2014, 22:19  [ТС]
gunslinger, не осталось ли у вас исходников от программы cpu_usage?
та, которая в архиве, она не запускается
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
22.12.2014, 22:41
Глючный билдер не всегда настройки проекта сохраняет (но это лишь мои проблемы).
Лови. XE5 если что.
Вложения
Тип файла: zip cpu_usage.zip (1.40 Мб, 151 просмотров)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2014, 22:41
Помогаю со студенческими работами здесь

Загруженность цп 100% в простое, при открытии диспетчера задач загруженность падает
Здравствуйте! процессор amd fx 8320, в простое нагружаются 4 ядра из 8 до 100%, как только запускаю диспетчер задач или process explorer,...

Получить загруженность процессора андроида
Как подобное можно сделать? Нашел программу https://play.google.com/store/apps/details?id=pavel.ugo.cpumonitor4 Она вычисляет %...

Как определить загруженность?
Доброй ночи, уважаемые пользователи форума. Подскажите пожалуйста, как правильно определить загруженность. Существуют 3 станка, они...

Как вставить индикатор в процентах?
Я, наверное, засыпал вопросами... Но все-таки: можно ли, и если можно, то как, вставить индикацию в процентах в ProgressBar? ...

Как сделать элементы в процентах?
&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot; height=&quot;175&quot; style=&quot;background:url('*******') repeat-x;&quot;&gt; &lt;tr&gt; &lt;td...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru