Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TidBytes как почистить? / 25 сообщений из 28, страница 1 из 2
12.09.2019, 16:00
    #39861049
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Доброго времени суток.

Есть у меня процедура отправки udp пакетов

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
 Pack: TidByte;
begin
  ...
  UClient.SendBuffer(IPaddr, IPport, Pack);
  Pack:= nil;
 ...
end;



И менеджер памяти Windows мне говорит, что память не чиститься. Но у динамических массивов присвоение nil равносильно уничтожению или я не прав?
...
Рейтинг: 0 / 0
12.09.2019, 16:04
    #39861055
Alexander Zuev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Это ты с интерфейсами перепутал. Используй SetLength в 0.
...
Рейтинг: 0 / 0
12.09.2019, 16:05
    #39861056
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Динамический массив сам почистится при выходе из метода..
Ну или SetLength(Pack, 0);
...
Рейтинг: 0 / 0
12.09.2019, 16:07
    #39861059
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, в доках написано, что SetLength и nil однозначны
...
Рейтинг: 0 / 0
12.09.2019, 16:30
    #39861073
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Ну раз менеджер памяти говорит что не чистится...
А ReportMemoryLeaksOnShutdown := True не говорит об утечках при закрытии, то память у вас не утекает, а накапливается и не освобождается вовремя
...
Рейтинг: 0 / 0
12.09.2019, 16:32
    #39861075
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, в том то и дело, что fastmem молчит. При выходе я все чищу. Вы правы накапливается и не освобождается вовремя
...
Рейтинг: 0 / 0
12.09.2019, 16:35
    #39861079
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Значит дело не в Pack:= nil;
Ищите почему вы чистите только при выходе, а не во время работы...
...
Рейтинг: 0 / 0
13.09.2019, 12:37
    #39861448
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
чувствую, что накидаете на вентилятор, но куда деваться
сделан консольное приложение и не пойму почему память не чиститься?

Код: 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.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  FastMM4 in 'FastMM4.pas',
  FastMM4Messages in 'FastMM4Messages.pas',
  System.SysUtils,
  IdGlobal,
  System.Generics.Collections,
  System.SyncObjs;

type
  TRec = packed record
    num1: uint32;
    num2: uint16;
    num3: uint16;
  end;

 PRec = ^TRec;

 TQueueAr = class(TObject)
    private
      FQ: TQueue<TIdBytes>;
      FCS: TCriticalSection;
    public
      constructor Create(const ACapacity: integer); overload;
      destructor Destroy(); override;
      function PopRecord: TIdBytes;
      procedure PushRecord(const AObject: TIdBytes);
      function Count: Integer;
  end;

function TQueueAr.Count: Integer;
begin
  Result:= FQ.Count;
end;

constructor TQueueAr.Create(const ACapacity: integer);
begin
  inherited Create;
  FCS:= TCriticalSection.Create;
  FQ:= TQueue<TIdBytes>.Create;
  FQ.Capacity:= ACapacity;
end;

destructor TQueueAr.Destroy;
begin
  try
    FCS.Free;
    FQ.Free;
  finally
    inherited;
  end;
end;

function TQueueAr.PopRecord: TIdBytes;
begin
  FCS.Enter;
  try
    if FQ.Count = 0  then  Result:= nil
    else Result:= FQ.Dequeue;
  finally
    FCS.Leave;
  end;
end;

procedure TQueueAr.PushRecord(const AObject: TIdBytes);
begin
  FCS.Enter;
  try
    FQ.Enqueue(AObject);
  finally
    FCS.Leave;
  end;
end;

var
  QUEUE_AR: TQueueAr;


procedure SetVal(R: TidBytes; const ANumber1: uint32; const ANumber2, ANumber3: uint16);
begin
    PRec(@R[0])^.num1 := ANumber1;
    PRec(@R[0])^.num2 := ANumber2;
    PRec(@R[0])^.num3 := ANumber3;
end;

procedure Test;
var
 ar: TidBytes;
 i: integer;
begin
  for i := 1 to 1000000 do begin
   SetLength(ar, SizeOf(PRec));
   SetVal(ar, i, 222, 333);
   QUEUE_AR.PushRecord(ar);
  end;
  sleep(1000);
end;

function GetPacket: TIdBytes;
begin
  Result:= nil;
  if QUEUE_AR.count = 0 then exit;
  Result:= QUEUE_AR.PopRecord;
end;

procedure Run;
var
  ar: TIdBytes; 
begin
  ar:= GetPacket;
  if ar= nil then exit;
  ar:= nil;
end;

begin
  ReportMemoryLeaksOnShutdown:= True;
  writeln('заполням очередь');
  readln;   //ОП 6532кБ
  QUEUE_AR:= TQueueAr.Create(1000);
  test;
  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
  writeln('заполнили очередь');
  readln;  //ОП 298048 кБ
  WriteLn('Clear');
  while QUEUE_AR.Count <> 0 do
  Run; //Удаляли удаляли, а толку ноль
  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
  writeln('чистим очередь');
  readln;  // //ОП 298048 кБ
  QUEUE_AR.FQ.Clear;
  QUEUE_AR.FQ.TrimExcess;


  Writeln('Для остановки приложения нажмите <Enter>...');
    ReadLn; //289976 кБ
  QUEUE_AR.Free;
end.
...
Рейтинг: 0 / 0
13.09.2019, 12:46
    #39861456
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
а если сделать так, то память не растет.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for i := 1 to 10 do begin

  test;
//  writeln('QUEUE_AR.Count = ' + QUEUE_AR.Count.ToString);
//  writeln('заполнили очередь');
//  readln;  //ОП 298048кБ
//  WriteLn('Clear');
  while QUEUE_AR.Count <> 0 do
  Run; //Удаляли удаляли, а толку ноль

  end;



неужто очередь так гадко себя ведет?
...
Рейтинг: 0 / 0
13.09.2019, 12:52
    #39861458
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Код: pascal
1.
 SetLength(ar, SizeOf(PRec^));
...
Рейтинг: 0 / 0
13.09.2019, 13:33
    #39861486
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
_Vasilisk_,
1. выдает ошибку ваша запись
2. для Trecord все равно с "^" или без
...
Рейтинг: 0 / 0
13.09.2019, 13:42
    #39861495
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
У меня ваш код выпадает с Out of Memory
Хотя 9 Гб свободны
...
Рейтинг: 0 / 0
13.09.2019, 13:44
    #39861496
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
А вот если заменить
SetLength(ar, SizeOf(PRec));
на
SetLength(ar, SizeOf(TRec));
то работает
...
Рейтинг: 0 / 0
13.09.2019, 13:44
    #39861497
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, rio.2 win7 64
...
Рейтинг: 0 / 0
13.09.2019, 13:45
    #39861498
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, блин у меня и так и так работает
...
Рейтинг: 0 / 0
13.09.2019, 13:47
    #39861503
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, а память также около 300 мб?
...
Рейтинг: 0 / 0
13.09.2019, 13:48
    #39861506
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Нет.. там где у вас строчка
//Удаляли удаляли, а толку ноль
у меня уже 8000 кб
...
Рейтинг: 0 / 0
13.09.2019, 13:49
    #39861507
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Все логично...
SizeOf(PRec) <> SizeOf(TRec)
4 <> 8
...
Рейтинг: 0 / 0
13.09.2019, 13:50
    #39861508
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, темные вычислительные силы. Буду в бубен бить. Спасибо за тесты
...
Рейтинг: 0 / 0
13.09.2019, 13:51
    #39861509
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
X-Cite, у меня и в первом и втором случае 8 и 8
...
Рейтинг: 0 / 0
13.09.2019, 13:51
    #39861510
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
Под Win64 да..
SizeOf(PRec) = 8, потому что 8 байт размер указателя..
Но вам просто повезло и совпало...
...
Рейтинг: 0 / 0
13.09.2019, 13:51
    #39861511
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
win64 же)
...
Рейтинг: 0 / 0
13.09.2019, 13:53
    #39861515
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
В любом случае:
заполнили очередь = 40188 Кб
чистим очередь = 11212 Кб
Для остановки приложения нажмите <Enter> = 3100 Кб
...
Рейтинг: 0 / 0
13.09.2019, 13:53
    #39861516
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
спасибо за советы!

еще бы разобраться с менеджером. почему у вас 8000 кб, а у меня 298000
...
Рейтинг: 0 / 0
13.09.2019, 13:55
    #39861517
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TidBytes как почистить?
У меня стандартный из коробки (встроенный fastmm)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TidBytes как почистить? / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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