powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / На каком ядре выполняется процесс
16 сообщений из 16, страница 1 из 1
На каком ядре выполняется процесс
    #40000572
st74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть код.
Код: pascal
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.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, TlHelp32, PSAPI;

type

TForm1 = class(TForm)

Button1: TButton;

Memo1: TMemo;

Button2: TButton;
    Memo2: TMemo;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;

procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

private
 phKill: THandle;
{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var
   hSnapShot: THandle;
   ProcInfo: TProcessEntry32;
//   a : uint32;
   a : Thandle;
begin
memo1.Lines.Clear;

  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot > 0)then // THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      Memo1.Lines.Add(ProcInfo.szExeFile + ('All Handle ' + inttostr(hSnapShot)));
      while (Process32Next(hSnapShot, ProcInfo)) do begin
        a := ProcInfo.th32ProcessID;
        Memo1.Lines.Add(ProcInfo.szExeFile);
        memo1.Text := memo1.Text + ' IDProcess ' + (inttostr(a));
        phKill := a;
      end;
    end;
    CloseHandle(hSnapShot);
  end;
 memo2.Lines.Add(inttostr(memo1.Lines.Count -2));
end;
end.


по нажатию button1 в memo выводится текст

[System Process]All Handle 376
System
IDProcess 4 // вопрос по этой части - это кол-во заюзаных прцессоров\ядер????
smss.exe IDProcess 340
csrss.exe IDProcess 484
wininit.exe IDProcess 548
csrss.exe IDProcess 584
services.exe IDProcess 608
lsass.exe IDProcess 624
lsm.exe IDProcess 632
svchost.exe IDProcess 756
winlogon.exe IDProcess 828
nvvsvc.exe IDProcess 892
svchost.exe IDProcess 932
svchost.exe IDProcess 1012
svchost.exe IDProcess 460
svchost.exe IDProcess 700
svchost.exe IDProcess 916
svchost.exe IDProcess 1128
svchost.exe IDProcess 1264
nvxdsync.exe IDProcess 1364
nvvsvc.exe IDProcess 1372
spoolsv.exe IDProcess 1500
svchost.exe IDProcess 1540
GfExperienceService.exe IDProcess 1684
NvNetworkService.exe IDProcess 1736
taskhost.exe IDProcess 1876
dwm.exe IDProcess 1924
explorer.exe IDProcess 1984
NvStreamService.exe IDProcess 2036
PDEngine.exe IDProcess 1236
sqlwriter.exe IDProcess 448
ss_conn_service.exe IDProcess 2068
ss_conn_service2.exe IDProcess 2088
svchost.exe IDProcess 2120
vmnat.exe IDProcess 2188
PDAgent.exe IDProcess 2232
vmnetdhcp.exe IDProcess 2304
ClassicStartMenu.exe IDProcess 2444
RAVCpl64.exe IDProcess 2452
NvBackend.exe IDProcess 2508
svchost.exe IDProcess 2952
NvStreamNetworkService.exe IDProcess 3012
svchost.exe IDProcess 2560
NvStreamUserAgent.exe IDProcess 3168
conhost.exe IDProcess 3196
taskeng.exe IDProcess 3384
TOTALCMD.EXE IDProcess 3416
PDAgentS1.exe IDProcess 3620
SearchIndexer.exe IDProcess 3868
nvtray.exe IDProcess 3316
WmiApSrv.exe IDProcess 2940
sppsvc.exe IDProcess 3240
utorrent.exe IDProcess 4332
taskhost.exe IDProcess 784
Skype.exe IDProcess 4524
Skype.exe IDProcess 3820
Skype.exe IDProcess 2604
Skype.exe IDProcess 3364
Skype.exe IDProcess 3284
Skype.exe IDProcess 2896
OperaPortable.exe IDProcess 4780
opera.exe IDProcess 3984
TCMDX64.EXE IDProcess 4256
bsplayer.exe IDProcess 1776
audiodg.exe IDProcess 2852
bds.exe IDProcess 476
dbkw64_25_0.exe IDProcess 1116
conhost.exe IDProcess 4972
dbkw64_25_0.exe IDProcess 2368
conhost.exe IDProcess 3076
Project1.exe IDProcess 2080

Теперь собственно сам вопрос - узнать на каком физическом\логическом ядре выполняется процесс?
Гугль уже покурил. пока остановился на либе TlHelp32. общую загрузку проца реализовал. теперь надо вывисти на каком ядре выполняется нужный процесс. на самом деле как процес скачет с ядра на ядро....
но пока хотябы узнать на каком физическом\логическом ядре выполняется процесс.
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000577
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st74,

Давным-давно процессы живут (почти)равномерно на всех ядрах разом.
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st74узнать на каком физическом\логическом ядре выполняется процесс.

Собственно ответ: никак. Потому что выполняется не процесс, а потоки внутри него. И
выполняются они на том ядре на котором системе в голову взбрело. Причём взбрело именно в
данный тик. И данный тик ни один из потоков процесса может вообще не выполняться нигде,
ибо все они в состоянии ожидания (то бишь спячки).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000590
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже если у ОС есть функция, возвращающая номер ядра, на котором выполняется поток, информация будет приблизительной, т.к. в момент анализа результата такой функции ядро может быть уже другим.
Думаю, что номер ядра это характеристика контекста потока. В режиме kernel ОС точно знает номер ядра.
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000592
st74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ. это все понятно.
не лезь в систему - как и на чем считать. сама разберется. а если лесть то тока после того как сопли на уровне ASM разберёш...
с кластером и на Fortran поработал. достаточное время.... правда распределенные вычесления.
но сейчас...... ну не понимает заказчик......... всего гемороя. вот дай под винду и все. сделал на Fortrane - не катит а вот либы надо добавить в систему...... а вот так чтоб само в себе жило.... вобщем сами пониаете.....
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000593
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000594
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st74вобщем сами пониаете.....

Нет, не понимаем. Требует заказчик - нет проблем, любой факап за ваши деньги. Получаем
process CPU affinity, если в нём больше одного ядра - результат высасываем из ГСЧ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000660
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что заказчик с этой информацией делать будет? Реально интересно. Ведь зачем-то просит...
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000670
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger
А что заказчик с этой информацией делать будет? Реально интересно. Ведь зачем-то просит...
Ну я как-то дефрагментатор оперативной памяти писал под заказ. Без ГСЧ, правда, просто цикл со Sleep и прогрессбар.
Хз, как там кто его использовал, я деньги получил. С исходниками заказчику отправил :)
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40000763
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001111
st74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мдя... как всегда. картина репина приплыли.
даже не знаю как сказать.....
два дня убил на выяснение - на кой орган енто нужно. написал софтину чтобы показать как обычная простая программа размазывается по ядрам. вроде поняли. сговорились на тему просто показа загрузки ядер.
накопал на просторах adCpuUsage. подправил под WIN7. работает и вроде даже данные правдиые.

Но сталкнулся с траблой. при сборке под Win32 все работает.а вот при сборке Win64 выдает ошибку.
вопрос конечно решил но из серии "Мюсье знает толк в извращениях" обернул в DLL. и её пользую....

но по факту интересно почему в сборке вин32 работает, а вин64 ошибка.

исходник adCpuUsage
Код: pascal
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.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
unit adCpuUsage;

{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
CPU Usage Measurement routines for Delphi and C++ Builder

Author:       Alexey A. Dynnikov
EMail:        aldyn@chat.ru
WebSite:      http://www.aldyn.ru/
Support:      Use the e-mail aldyn@chat.ru
                          or support@aldyn.ru

Creation:     Jul 8, 2000
Version:      1.02

Legal issues: Copyright (C) 2000 by Alexey A. Dynnikov <aldyn@chat.ru>;

              This software is provided 'as-is', without any express or
              implied warranty.  In no event will the author be held liable
              for any  damages arising from the use of this software.

              Permission is granted to anyone to use this software for any
              purpose, including commercial applications, and to alter it
              and redistribute it freely, subject to the following
              restrictions:

              1. The origin of this software must not be misrepresented,
                 you must not claim that you wrote the original software.
                 If you use this software in a product, an acknowledgment
                 in the product documentation would be appreciated but is
                 not required.

              2. Altered source versions must be plainly marked as such, and
                 must not be misrepresented as being the original software.

              3. This notice may not be removed or altered from any source
                 distribution.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
USAGE:

1. Include this unit into project.

2. Call GetCPUCount to obtain the numbr of processors in the system

3. Each time you need to know the value of CPU usage call the CollectCPUData
   to refresh the CPU usage information. Then call the GetCPUUsage to obtain
   the CPU usage for given processor. Note that succesive calls of GetCPUUsage
   without calling CollectCPUData will return the same CPU usage value.

Example:

procedure TTestForm.TimerTimer(Sender: TObject);
var i: Integer;
begin
    CollectCPUData; // Get the data for all processors

    for i:=0 to GetCPUCount-1 do // Show data for each processor
        MInfo.Lines[i]:=Format('CPU #%d - %5.2f%%',[i,GetCPUUsage(i)*100]);
end;
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

interface

uses
    Windows, SysUtils;

// Call CollectCPUData to refresh information about CPU usage
procedure CollectCPUData;

// Call it to obtain the number of CPU's in the system
function GetCPUCount: Integer;

// Call it to obtain the % of usage for given CPU
function GetCPUUsage(Index: Integer): Double;

// For Win9x only: call it to stop CPU usage monitoring and free system resources
procedure ReleaseCPUData;

implementation

{$ifndef ver110}

    {$ifndef ver90}
    {$ifndef ver100}
    {$define UseInt64}
    {$endif}
    {$endif}


    {$ifdef UseInt64}
    type TInt64 = Int64;
    {$else}
    type TInt64 = Comp;
    {$endif}

{$else}

    type TInt64 = TLargeInteger;

{$endif}

type
    PInt64 = ^TInt64;

type
    TPERF_DATA_BLOCK = record
        Signature : array[0..4 - 1] of WCHAR;
        LittleEndian : DWORD;
        Version : DWORD;
        Revision : DWORD;
        TotalByteLength : DWORD;
        HeaderLength : DWORD;
        NumObjectTypes : DWORD;
        DefaultObject : Longint;
        SystemTime : TSystemTime;
        Reserved: DWORD;
        PerfTime : TInt64;
        PerfFreq : TInt64;
        PerfTime100nSec : TInt64;
        SystemNameLength : DWORD;
        SystemNameOffset : DWORD;
    end;

    PPERF_DATA_BLOCK = ^TPERF_DATA_BLOCK;

    TPERF_OBJECT_TYPE = record
        TotalByteLength : DWORD;
        DefinitionLength : DWORD;
        HeaderLength : DWORD;
        ObjectNameTitleIndex : DWORD;
        ObjectNameTitle : LPWSTR;
        ObjectHelpTitleIndex : DWORD;
        ObjectHelpTitle : LPWSTR;
        DetailLevel : DWORD;
        NumCounters : DWORD;
        DefaultCounter : Longint;
        NumInstances : Longint;
        CodePage : DWORD;
        PerfTime : TInt64;
        PerfFreq : TInt64;
    end;

    PPERF_OBJECT_TYPE = ^TPERF_OBJECT_TYPE;

type
    TPERF_COUNTER_DEFINITION = record
        ByteLength : DWORD;
        CounterNameTitleIndex : DWORD;
        CounterNameTitle : LPWSTR;
        CounterHelpTitleIndex : DWORD;
        CounterHelpTitle : LPWSTR;
        DefaultScale : Longint;
        DetailLevel : DWORD;
        CounterType : DWORD;
        CounterSize : DWORD;
        CounterOffset : DWORD;
    end;

    PPERF_COUNTER_DEFINITION = ^TPERF_COUNTER_DEFINITION;

    TPERF_COUNTER_BLOCK = record
        ByteLength : DWORD;
    end;

    PPERF_COUNTER_BLOCK = ^TPERF_COUNTER_BLOCK;

    TPERF_INSTANCE_DEFINITION = record
        ByteLength : DWORD;
        ParentObjectTitleIndex : DWORD;
        ParentObjectInstance : DWORD;
        UniqueID : Longint;
        NameOffset : DWORD;
        NameLength : DWORD;
    end;

    PPERF_INSTANCE_DEFINITION = ^TPERF_INSTANCE_DEFINITION;

//------------------------------------------------------------------------------
{$ifdef ver130}
{$L-}         // The L+ causes internal error in Delphi 5 compiler
{$O-}         // The O+ causes internal error in Delphi 5 compiler
{$Y-}         // The Y+ causes internal error in Delphi 5 compiler
{$endif}

{$ifndef ver110}
type
    TInt64F = TInt64;
{$else}
type
    TInt64F = Extended;
{$endif}

{$ifdef ver110}
function FInt64(Value: TInt64): TInt64F;
function Int64D(Value: DWORD): TInt64;
{$else}
type
    FInt64 = TInt64F;
    Int64D = TInt64;
{$endif}

{$ifdef ver110}
function FInt64(Value: TInt64): TInt64F;
var V: TInt64;
begin
    if (Value.HighPart and $80000000) = 0 then // positive value
    begin
        result:=Value.HighPart;
        result:=result*$10000*$10000;
        result:=result+Value.LowPart;
    end else
    begin
        V.HighPart:=Value.HighPart xor $FFFFFFFF;
        V.LowPart:=Value.LowPart xor $FFFFFFFF;
        result:= -1 - FInt64(V);
    end;
end;

function Int64D(Value: DWORD): TInt64;
begin
    result.LowPart:=Value;
    result.HighPart := 0; // positive only
end;
{$endif}

//------------------------------------------------------------------------------

const
    Processor_IDX_Str = '238';
    Processor_IDX = 238;
    CPUUsageIDX = 6;

type
    AInt64F = array[0..$FFFF] of TInt64F;
    PAInt64F = ^AInt64F;

var
    _PerfData : PPERF_DATA_BLOCK;
    _BufferSize: Integer;
    _POT : PPERF_OBJECT_TYPE;
    _PCD: PPerf_Counter_Definition;
    _ProcessorsCount: Integer;
    _Counters: PAInt64F;
    _PrevCounters: PAInt64F;
    _SysTime: TInt64F;
    _PrevSysTime: TInt64F;
    _IsWinNT: Boolean;

    _W9xCollecting: Boolean;
    _W9xCpuUsage: DWORD;
    _W9xCpuKey: HKEY;


//------------------------------------------------------------------------------
function GetCPUCount: Integer;
 var
  MySystem: TSystemInfo;
begin
  GetSystemInfo(MySystem);
  Result := MySystem.dwNumberOfProcessors;
//Result := 4;

end;

//------------------------------------------------------------------------------
procedure ReleaseCPUData;
var H: HKEY;
    R: DWORD;
    dwDataSize, dwType: DWORD;
begin
    if _IsWinNT then exit;
    if not _W9xCollecting then exit;
    _W9xCollecting:=False;

    RegCloseKey(_W9xCpuKey);

    R:=RegOpenKeyEx( HKEY_DYN_DATA, 'PerfStats\StopStat', 0, KEY_ALL_ACCESS, H );

    if R <> ERROR_SUCCESS then exit;

    dwDataSize:=sizeof(DWORD);

    RegQueryValueEx ( H, 'KERNEL\CPUUsage', nil, @dwType, PBYTE(@_W9xCpuUsage), @dwDataSize);

    RegCloseKey(H);

end;

//------------------------------------------------------------------------------
function GetCPUUsage(Index: Integer): Double;
begin
    if _IsWinNT then
    begin
        if _ProcessorsCount < 0 then CollectCPUData;
       if (Index >= _ProcessorsCount) or (Index < 0) then
           raise Exception.Create('CPU index out of bounds');
        if _PrevSysTime = _SysTime then result:=0 else
        result:=1-(_Counters[index] - _PrevCounters[index])/(_SysTime-_PrevSysTime);
    end else
    begin
        if Index <> 0 then
            raise Exception.Create('CPU index out of bounds');
        if not _W9xCollecting then CollectCPUData;
        result:=_W9xCpuUsage / 100;
    end;
end;

var VI: TOSVERSIONINFO;

//------------------------------------------------------------------------------
procedure CollectCPUData;
var BS: integer;
    i: Integer;
    _PCB_Instance: PPERF_COUNTER_BLOCK;
    _PID_Instance: PPERF_INSTANCE_DEFINITION;
    ST: TFileTime;

var H: HKEY;
    R: DWORD;
    dwDataSize, dwType: DWORD;
begin
    if _IsWinNT then
    begin
        BS:=_BufferSize;
        while RegQueryValueEx( HKEY_PERFORMANCE_DATA, Processor_IDX_Str, nil, nil,
                PByte(_PerfData), @BS ) = ERROR_MORE_DATA do
        begin
            // Get a buffer that is big enough.
            INC(_BufferSize,$1000);
            BS:=_BufferSize;
            ReallocMem( _PerfData, _BufferSize );
        end;

        // Locate the performance object
        _POT := PPERF_OBJECT_TYPE(DWORD(_PerfData) + _PerfData.HeaderLength);
        for i := 1 to _PerfData.NumObjectTypes do
        begin
            if _POT.ObjectNameTitleIndex = Processor_IDX then Break;
            _POT := PPERF_OBJECT_TYPE(DWORD(_POT) + _POT.TotalByteLength);
        end;

        // Check for success
        if _POT.ObjectNameTitleIndex <> Processor_IDX then
            raise Exception.Create('Unable to locate the "Processor" performance object');

        if _ProcessorsCount < 0 then
        begin
            _ProcessorsCount:=_POT.NumInstances;
            GetMem(_Counters,_ProcessorsCount*SizeOf(TInt64));
            GetMem(_PrevCounters,_ProcessorsCount*SizeOf(TInt64));
        end;

        // Locate the "% CPU usage" counter definition
        _PCD := PPERF_Counter_DEFINITION(DWORD(_POT) + _POT.HeaderLength);
        for i := 1 to _POT.NumCounters do
        begin
            if _PCD.CounterNameTitleIndex = CPUUsageIDX then break;
            _PCD := PPERF_COUNTER_DEFINITION(DWORD(_PCD) + _PCD.ByteLength);
        end;

        // Check for success
        if _PCD.CounterNameTitleIndex <> CPUUsageIDX then
            raise Exception.Create('Unable to locate the "% of CPU usage" performance counter');

        // Collecting coutners
        _PID_Instance := PPERF_INSTANCE_DEFINITION(DWORD(_POT) + _POT.DefinitionLength);
        for i := 0 to _ProcessorsCount-1 do
        begin
            _PCB_Instance := PPERF_COUNTER_BLOCK(DWORD(_PID_Instance) + _PID_Instance.ByteLength );

            _PrevCounters[i]:=_Counters[i];
            _Counters[i]:=FInt64(PInt64(DWORD(_PCB_Instance) + _PCD.CounterOffset)^);

            _PID_Instance := PPERF_INSTANCE_DEFINITION(DWORD(_PCB_Instance) + _PCB_Instance.ByteLength);
        end;

        _PrevSysTime:=_SysTime;
        SystemTimeToFileTime(_PerfData.SystemTime, ST);
        _SysTime:=FInt64(TInt64(ST));
    end else
    begin
        if not _W9xCollecting then
        begin
            R:=RegOpenKeyEx( HKEY_DYN_DATA, 'PerfStats\StartStat', 0, KEY_ALL_ACCESS, H );
            if R <> ERROR_SUCCESS then
                raise Exception.Create('Unable to start performance monitoring');

            dwDataSize:=sizeof(DWORD);

            RegQueryValueEx( H, 'KERNEL\CPUUsage', nil, @dwType, PBYTE(@_W9xCpuUsage), @dwDataSize );

            RegCloseKey(H);

            R:=RegOpenKeyEx( HKEY_DYN_DATA, 'PerfStats\StatData', 0,KEY_READ, _W9xCpuKey );

            if R <> ERROR_SUCCESS then
                raise Exception.Create('Unable to read performance data');

            _W9xCollecting:=True;
        end;

        dwDataSize:=sizeof(DWORD);
        RegQueryValueEx( _W9xCpuKey, 'KERNEL\CPUUsage', nil,@dwType, PBYTE(@_W9xCpuUsage), @dwDataSize );
    end;
end;


initialization
    _ProcessorsCount:= -1;
    _BufferSize:= $2000;
    _PerfData := AllocMem(_BufferSize);

    VI.dwOSVersionInfoSize:=SizeOf(VI);
    if not GetVersionEx(VI) then raise Exception.Create('Can''t get the Windows version');

    _IsWinNT := VI.dwPlatformId = VER_PLATFORM_WIN32_NT;
finalization
    ReleaseCPUData;
    FreeMem(_PerfData);
end.
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001128
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st74
а вин64 ошибка.

Текст ошибки нужно угадать?
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001132
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это что-то древнее когда еще win64 не было.. ессно там будут проблемы с типами и т.п.

По сути вам надо вот это

https://docs.microsoft.com/en-us/windows/win32/perfctrs/performance-counters-portal

Там есть API и через него можно достать все что хотите...
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001209
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001238
st74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function GetCPUUsage(Index: Integer): Double;
begin
    if _IsWinNT then
    begin
        if _ProcessorsCount < 0 then CollectCPUData;
       if (Index >= _ProcessorsCount) or (Index < 0) then
           raise Exception.Create('CPU index out of bounds');      // ошибка при запуске скомпилированной программы выпадает сдесь при сборке под Win64........ сразу после вызова процедуры. при сборке под Win32 все работает.
        if _PrevSysTime = _SysTime then result:=0 else
        result:=1-(_Counters[index] - _PrevCounters[index])/(_SysTime-_PrevSysTime);
    end else
    begin
        if Index <> 0 then
            raise Exception.Create('CPU index out of bounds');
        if not _W9xCollecting then CollectCPUData;
        result:=_W9xCpuUsage / 100;
    end;
end;



Народ все понимаю. что это извращение и костыли. но времени на написание свежего кода просто физически нет(еще 3 проекта в работе). хотя другого варианта не вижу. сейчас хотябы просто прототип закончить и показать заказчику.
...
Рейтинг: 0 / 0
На каком ядре выполняется процесс
    #40001289
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st74
Код: pascal
1.
2.
if (Index >= _ProcessorsCount) or (Index < 0) then
  raise Exception.Create('CPU index out of bounds');      // ошибка при запуске скомпилированной программы выпадает сдесь при сборке под Win64........ сразу после вызова процедуры. при сборке под Win32 все работает.

Все просто - вы передаете в GetCPUUsage или отрицательный индекс или слишком большой индекс
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / На каком ядре выполняется процесс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]