Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TThread и Physical Memory [D6, WinME]


Дмитрий Иванов ©   (2002-05-05 20:14:00) 

Здравствуй всезнающий Ол! Помоги мне найти ответ на мой вопрос - почему уменьшается Physical Memory при использовании TThread? И вообще это опасно?

Пример кода:

unit Search;
interface
uses
Classes, MainUnit;
type
TSearch = class(TThread)
private
FFirma:FTFirma;// FTFirma - указатель на файл типа TFirma
Keys:PFirmKeys;//PFirmKeys=^FirmKeys, где FirmKeys=array of integer
Mas:PMTFirma;//PMTFirma=^MTFirma, где MTFirma=array of TFirma
protected
procedure Execute; override;
public
constructor Create(_FFirma:FTFirma; _Keys:PFirmKeys; _Mas:PMTFirma);
end;
implementation

constructor TSearch.Create (_FFirma:FTFirma; _Keys:PFirmKeys; _Mas:PMTFirma);
begin
FFirma:=_FFirma;Keys:=_Keys;Mas:=_Mas;
inherited Create(false);
end;

procedure TSearch.Execute;
var i:integer;BufFirma:TFirma;
begin
for i:=0 to High(Keys) do
begin
Seek(FFirma^,Keys^[i]-1);
Read(FFirma^,BufFirma);
Mas^[i]:=BufFirma;
end;
end;
end.

===================================
где-то в главном модуле в обработчике onclick какой-то клавиши

...
SetLength(mas,High(Keys));
Poisk:=TSearch.Create(@FPS,@Keys,@Mas);
Poisk.FreeOnTerminate:=true;
Poisk.Priority:=tplower;
...

Программа в фоновом режиме забивает массив Mas, при этом данные считываются из файла FFirma при помощи массива ключей Keys, в котором записаны номера записей которые надо считать.
Нажимая на эту клавишу, замечаю (глядя на тесты), что Pysical Memory быстренько уменьшается и после N-го нажатия ~0kB. Может я что-то делаю не так? Или может это вообще не страшно и не стоит по этому поводу волноваться?
Ответь мне Ол...


Дмитрий Иванов   (2002-05-10 18:39:00) [1]


> Виктор Щербаков © (07.05.02 09:13)
> Присваивание nil переменной, имеющий тип динамического массива > действительно освобождает память :)
> Не верите? Посмотрите сгенерированный код.


Вот и я про тоже...


> Cobalt ©
> Это для простых динамических массивов. А у вас ведь (насколько
> я понял) - динамический массив указателей, поэтому надо
> проходить по всему массиву и каждому элементу присваивать
> Nil (или - чем вы там выделяли? FreeMem? )


Не, массив у меня из обычных записей, поэтому вроде каждому элементу массива nil присваивать не надо.
Память выделял так - SetLength(mas,High(Keys))


> Lord Warlock © (07.05.02 09:08)
> Fay © (07.05.02 07:57) прав, именно SetLength(Mas, 0)
> освобождает память, занимаемую массивом, а книжки внимательнее
> надо читать nil убивает указатель на облать памяти, а не
> данные, на которые этот указатель указывает (тавтология
> :)


Точно;-), внимательнее их надо читать:)


Cobalt   (2002-05-07 09:17:00) [2]

>достаточно написать Mas:=Nil
Это для простых динамических массивов. А у вас ведь (насколько я понял) - динамический массив указателей, поэтому надо проходить по всему массиву и каждому элементу присваивать Nil (или - чем вы там выделяли? FreeMem? )


Виктор Щербаков   (2002-05-07 09:13:00) [3]


> а книжки внимательнее надо читать nil убивает указатель
> на облать памяти, а не данные, на которые этот указатель
> указывает

Присваивание nil переменной, имеющий тип динамического массива действительно освобождает память :)
Не верите? Посмотрите сгенерированный код.

Хотя нет оснований не верить хэлпу. В нем написано:
To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it.


Lord Warlock   (2002-05-07 09:08:00) [4]

Fay © (07.05.02 07:57) прав, именно SetLength(Mas, 0) освобождает память, занимаемую массивом, а книжки внимательнее надо читать nil убивает указатель на облать памяти, а не данные, на которые этот указатель указывает (тавтология :)


Fay   (2002-05-07 07:57:00) [5]

A SetLength(Mas, 0) не прокатит?


Дмитрий Иванов   (2002-05-06 16:38:00) [6]

SoftOne ©
А с чего бы это вдруг?
После этого Вы просто теряете указатель на область памяти, где были записаны данные. Но она, по-прежнему, занята Вами!


В книжках написано - чтобы освободить память выделенную при помощи SetLength(Mas,Count) достаточно написать Mas:=Nil и память освободиться...получается это не так8-0. Помогите тогда, как правильно освободить эту память?


Lord Warlock   (2002-05-06 09:16:00) [7]

В OnExecute есть строчка Mas^[i]:=BufFirma;
А куда этот мас потом уходит? его кто-нить уничтожает?
Из приведенного кода этого не видно


SoftOne   (2002-05-06 02:33:00) [8]

> я делаю Mas:=nil и по идее память, которая выделилась при
> последнем нажатии клавиши, должна освободиться

А с чего бы это вдруг?
После этого Вы просто теряете указатель на область памяти, где были записаны данные. Но она, по-прежнему, занята Вами!


Дмитрий Иванов   (2002-05-05 23:44:00) [9]

~Sergius (05.05.02 23:01)
Вообще, замечана закономерность: чем больше записивается в память, тем меньше в ней остается места. Вот так.

:)

Кстати, перед SetLength(mas,High(Keys)) я делаю Mas:=nil и по идее память, которая выделилась при последнем нажатии клавиши, должна освободиться, и размер доступной физической памяти должен увеличиться, так? Или ничего подобного?

А что значит "напрямую выполнять программы на винчестере"?


~Sergius   (2002-05-05 23:01:00) [10]

Вообще, замечана закономерность: чем больше записивается в память, тем меньше в ней остается места. Вот так.

(ну, щас точно в "Потрепаться" улетим:)


~Sergius   (2002-05-05 22:58:00) [11]

Ничего в память не записывать.
Доказано, что в смысле экономии памяти, наилучшей стратегией будет отказаться от загрузки данных и инструкций в оперативную память. Есть два варианта - использовать флеш-память или же напрямую выполнять программы на винчестере.
Источники:

1. Gerbert S. & Wanson F. Effective use of Windows memory, pg. 230-250.
2. Hobbit-Bobbit. The Art of computer programming.



Дмитрий Иванов   (2002-05-05 22:25:00) [12]

:)
Ну а как тогда сделать, чтобы не уменьшалась?


Anatoly Podgoretsky   (2002-05-05 22:16:00) [13]

То что уменьшается это плохо, а то что не отваливается хорошо


Дмитрий Иванов   (2002-05-05 22:09:00) [14]

Ну да...
А это хорошо или плохо?


~Sergius   (2002-05-05 20:35:00) [15]

Я так понимаю уменьшается ДОСТУПНАЯ физ. память, а не ПАМЯТЬ физическая? То есть куски от чипа не отваливаются? 8-0


Наверх

Титульная страница Поиск, карта сайта Написать письмо