−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
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= CPUIdle
else
(ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= 100;
Нам нужно больше тернарноговна
Это, наверно, в новых версиях появилось... Во всяком случае, я не знал о такой штуке.
Правда, придётся описывать для каждого типа...
Попытался определить, в какой версии появилась «из коробки». Нашёл аж в двух модулях, начиная с XE2:
http://docwiki.embarcadero.com/Libraries/XE2/en/System.Math.IfThen
http://docwiki.embarcadero.com/Libraries/XE2/en/System.StrUtils.IfThen
В более ранних что-то не обнаруживается.
Для меня время остановилось на Win 7 (без первис пака) и Delphi 7 (иногда - 2009, если требуется поддержка юникода). А дальше - конец света
http://docwiki.embarcadero.com/VCL/2010/en/Math.IfThen
http://docwiki.embarcadero.com/VCL/2010/en/StrUtils.IfThen
P.S. Починил, проверьте.
В Delphi 6 точно есть (и в Math, и в StrUtils), причём определено так же, как я процитировал ниже.
В Delphi 5 отсутствует (в пятых Дельфях даже модуля StrUtils нет).
Math.pas из Delphi 8:
StrUtils.pas из Delphi 8:
Единственный «хак» — это слово «overload», которого в старых дельфях не было.
гонишь небось. Скажи еще что reintroduce в турбопаскале не было.
http://govnokod.ru/22346#comment371705
Смог только 2 комма зациклить. Почти.
Можно набросать прогу для этого, смеха ради, только видишь ли, я давно уже не пишу только ради прикола.
Нужно перевести исходники dll "С" на "Delphi".