Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

TThread и Physical Memory   Найти похожие ветки 

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

Здравствуй всезнающий Ол! Помоги мне найти ответ на мой вопрос - почему уменьшается 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. Может я что-то делаю не так? Или может это вообще не страшно и не стоит по этому поводу волноваться?
Ответь мне Ол...


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

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


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

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


 
Anatoly Podgoretsky ©   (2002-05-05 22:16) [3]

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


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

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


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

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

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




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

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

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


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

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

:)

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

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


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

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

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


 
Lord Warlock ©   (2002-05-06 09:16) [9]

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


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

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


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


 
Fay ©   (2002-05-07 07:57) [11]

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


 
Lord Warlock ©   (2002-05-07 09:08) [12]

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


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


> а книжки внимательнее надо читать 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.


 
Cobalt ©   (2002-05-07 09:17) [14]

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


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


> Виктор Щербаков © (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 убивает указатель на облать памяти, а не
> данные, на которые этот указатель указывает (тавтология
> :)


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



Страницы: 1 вся ветка

Текущий архив: 2002.05.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
3-72994
PavelOKES
2002-04-24 07:53
2002.05.23
Delphi + MSAccess = глюк


1-73234
ДимкаН
2002-05-15 09:33
2002.05.23
Автоматизация и Excel


3-73016
rem_
2002-04-25 10:54
2002.05.23
LookUp


1-73180
sammy
2002-05-14 09:06
2002.05.23
Версия проекта


1-73312
Tosha_a
2002-05-11 19:43
2002.05.23
как вызвать процедуру одного класса в функции другого?