Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
6-73340
igmel
2002-03-13 06:49
2002.05.23
Пинг


3-73075
NDVBrest
2002-04-26 11:02
2002.05.23
TThread и TQuery


4-73449
Roman_
2002-03-21 16:22
2002.05.23
Эмуляция третей кнопки мышки.


14-73378
mart
2002-04-16 02:41
2002.05.23
Дача


6-73339
Андрей Сенченко
2002-03-12 22:10
2002.05.23
Непонятная ошибка в NMSMTP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский