MemAvail и MaxAvail

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

MemAvail и MaxAvail

Сообщение RENXFIL » 17.11.2012 11:56:18

MemAvail и MaxAvail, может кто знает полный код функции, в инете искал не нашёл, или другие варианты замены данных функций, очень надо, в Lazarus-е не работает данная функция!
MemAvail - Возвращает количество всей свободной памяти в куче.
MaxAvail - Возвращает размер самого большого непрерывного свободного блока в куче.

Код: Выделить всё
program ptr_prog;
{$mode objfpc}{$H+}
uses DOS,CRT,Windows,renxfiltrus,RenWin; {renxfiltrus,RenWin - это моё}
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
const max = 1000;
type vector_ptr = ^vector;
      vector = array[1..max] of longint;
var VP: vector_ptr;
     i,j: Int64;
     k: word;
     q: string;
begin
  clrscr;
  RenxWin(3,11,1); {Razmer okna, Color linii, Color fona}
  GotoXY(29,2); xfil_ruslazdos('Использование указателей',true);
  q:=xfil_ruslazdos(' байт',false);
  i:=MemAvail;
  GotoXY(3,5); write(xfil_ruslazdos('Перед размещением свободно ',false),i:7,q);
  New(VP);
  j:=MemAvail;
  GotoXY(3,6); write(xfil_ruslazdos('После размещения свободно ',false),j:7,q);
  k:=i-j;
  GotoXY(3,7); write(xfil_ruslazdos('Разрешено ',false),k:7,q);
  for k:=1 to max do VP^[k]:=2*k+1;
  Dispose(VP);
  VP:=nil;
  i:=MemAvail;
  GotoXY(3,8); write(xfil_ruslazdos('После освобождения свободно ',false),i:7,q);
  GotoXY(3,23); xfil_ruslazdos('Нажмите <Enter>:',true);
  readln;
end.
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: MemAvail и MaxAvail

Сообщение RENXFIL » 21.11.2012 13:21:42

Модуль System не воспринимается почему?
ptr_prog.pas(3,21) Error: Duplicate identifier "SYSTEM"
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.

Re: MemAvail и MaxAvail

Сообщение SSerge » 21.11.2012 15:14:06

RENXFIL, поскольку в windows|linux размер доступной оперативной памяти - понятие не существующее, благодаря исполнению в виртуальном адресном пространстве, то нет этих функций и не может быть принципиально.

The old Turbo Pascal functions MemAvail and MaxAvail functions are no longer available in Free Pascal as of version 2.0. The reason for this incompatibility is below:

On modern operating systems, 4 the idea of ”Available Free Memory” is not valid for an application. The reasons are:

One processor cycle after an application asked the OS how much memory is free, another application may have allocated everything.
It is not clear what ”free memory” means: does it include swap memory, does it include disk cache memory (the disk cache can grow and shrink on modern OS’es), does it include memory allocated to other applications but which can be swapped out, etc.

Therefore, programs using MemAvail and MaxAvail functions should be rewritten so they no longer use these functions, because it does not make sense anymore on modern OS’es. There are 3 possibilities:

Use exceptions to catch out-of-memory errors.
Set the global variable ”ReturnNilIfGrowHeapFails” to True and check after each allocation whether the pointer is different from Nil.
Don’t care and declare a dummy function called MaxAvail which always returns High(LongInt) (or some other constant).
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: MemAvail и MaxAvail

Сообщение RENXFIL » 22.11.2012 12:40:49

Система переписана и модернизирована, всё понятно)
Спасибо, вот и чёткий ответ =)
Аватара пользователя
RENXFIL
новенький
 
Сообщения: 16
Зарегистрирован: 23.09.2011 16:47:57
Откуда: Я и сам не знаю.


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 222

Рейтинг@Mail.ru