−13
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
{Автор Зорков Игорь - [email protected]}
procedure TForm1.RefreshInfo;
var
i, ProcessCount: Integer;
Processes: TProcesses;
CPU, CPUIdle: Extended;
begin
TickCountOld:= GetTickCount - TickCount;
TickCount:= GetTickCount;
ProcessCount:= GetProcesses(Processes);
NewPIDList.Clear;
for i:= 0 to ProcessCount - 1 do
NewPIDList.Add(IntToStr(Processes[i].PID));
if (NewPIDList.Text <> PIDList.Text) then
begin
if NewPIDList.Count > 0 then
begin
for i:= 0 to NewPIDList.Count - 1 do
begin
if PIDList.IndexOf(NewPIDList.Strings[i]) = -1 then
begin
SetLength(ProcessInfo, Length(ProcessInfo) + 1);
ProcessInfo[ProcessInfoList.Count]:= TProcessInfo.Create;
ProcessInfo[ProcessInfoList.Count].Process:= Processes[i].Process;
ProcessInfo[ProcessInfoList.Count].PID:= Processes[i].PID;
CPU:= Int64(Processes[i].KernelTime.dwLowDateTime or (Processes[i].KernelTime.dwHighDateTime shr 32)) + Int64(Processes[i].UserTime.dwLowDateTime or (Processes[i].UserTime.dwHighDateTime shr 32));
ProcessInfo[ProcessInfoList.Count].CPU:= CPU;
ProcessInfo[ProcessInfoList.Count].CPUDelta:= CPU;
if bRefreshFirstTime then
ProcessInfo[ProcessInfoList.Count].New:= 2
else
ProcessInfo[ProcessInfoList.Count].New:= 0;
ProcessInfo[ProcessInfoList.Count].Terminated:= 20;
ProcessInfoList.AddObject(NewPIDList.Strings[i], ProcessInfo[ProcessInfoList.Count]);
end;
end;
end;
if PIDList.Count > 0 then
begin
for i:= 0 to PIDList.Count - 1 do
begin
if NewPIDList.IndexOf(PIDList.Strings[i]) = -1 then
begin
if ProcessInfoList.IndexOf(PIDList.Strings[i]) <> -1 then
begin
if (ProcessInfoList.Objects[ProcessInfoList.IndexOf(PIDList.Strings[i])] as TProcessInfo).Terminated = 20 then
(ProcessInfoList.Objects[ProcessInfoList.IndexOf(PIDList.Strings[i])] as TProcessInfo).Terminated:= 0;
end;
end;
end;
end;
PIDList.Assign(NewPIDList);
end;
CPUIdle:= 0;
for i:= 0 to ProcessCount - 1 do
begin
CPU:= Int64(Processes[i].KernelTime.dwLowDateTime or (Processes[i].KernelTime.dwHighDateTime)) + Int64(Processes[i].UserTime.dwLowDateTime or (Processes[i].UserTime.dwHighDateTime));
(ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPUDelta:= CPU - (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPU;
(ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPU:= CPU;
if Processes[i].PID <> 0 then
CPUIdle:= CPUIdle + (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPUDelta;
end;
if CPUIdle > 0 then
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= CPUIdle
else
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= 100;
Зачем юзать переменные? Это, блять, грех. Бог покарает. Обратите внимание, как этот долбоёб приводит типы, и сколько раз обращается к объекту по его индексу.
Автор, возьми меч из папье-маше и отсеки себе руки по локоть. По локоть, блядь!..
Запостил: rotretS,
16 Февраля 2017
guestinho 16.02.2017 23:57 # +1
dm_fomenok 16.02.2017 23:59 # 0
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= CPUIdle
else
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= 100;
Нам нужно больше тернарноговна
guest 17.02.2017 14:15 # 0
CTEPTOP 17.02.2017 17:34 # 0
Это, наверно, в новых версиях появилось... Во всяком случае, я не знал о такой штуке.
inkanus-gray 17.02.2017 18:19 # 0
Правда, придётся описывать для каждого типа...
Попытался определить, в какой версии появилась «из коробки». Нашёл аж в двух модулях, начиная с XE2:
http://docwiki.embarcadero.com/Libraries/XE2/en/System.Math.IfThen
http://docwiki.embarcadero.com/Libraries/XE2/en/System.StrUtils.IfThen
В более ранних что-то не обнаруживается.
CTEPTOP 17.02.2017 19:03 # 0
Для меня время остановилось на Win 7 (без первис пака) и Delphi 7 (иногда - 2009, если требуется поддержка юникода). А дальше - конец света
guest 17.02.2017 19:21 # +1
inkanus-gray 17.02.2017 19:32 # 0
http://docwiki.embarcadero.com/VCL/2010/en/Math.IfThen
http://docwiki.embarcadero.com/VCL/2010/en/StrUtils.IfThen
inkanus-gray 17.02.2017 19:35 # 0
P.S. Починил, проверьте.
inkanus-gray 17.02.2017 21:35 # 0
В Delphi 6 точно есть (и в Math, и в StrUtils), причём определено так же, как я процитировал ниже.
В Delphi 5 отсутствует (в пятых Дельфях даже модуля StrUtils нет).
dxd 17.02.2017 21:08 # +1
guest 17.02.2017 21:13 # +1
inkanus-gray 17.02.2017 21:22 # 0
Math.pas из Delphi 8:
StrUtils.pas из Delphi 8:
Единственный «хак» — это слово «overload», которого в старых дельфях не было.
guest 17.02.2017 21:33 # −2
гонишь небось. Скажи еще что reintroduce в турбопаскале не было.
CTEPTOP 17.02.2017 21:36 # 0
inkanus-gray 17.02.2017 21:40 # +1
Dr_Stertor 17.02.2017 21:42 # 0
http://govnokod.ru/22346#comment371705
guest 17.02.2017 21:43 # 0
Dr_Stertor 17.02.2017 21:46 # 0
Смог только 2 комма зациклить. Почти.
Можно набросать прогу для этого, смеха ради, только видишь ли, я давно уже не пишу только ради прикола.
barop 17.02.2017 03:23 # 0
Нужно перевести исходники dll "С" на "Delphi".
CTEPTOP 17.02.2017 19:07 # 0