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

Вниз

TMemoryStatus - объясните, пожалуйста   Найти похожие ветки 

 
^SANYA ©   (2002-08-04 17:47) [0]

Вопрос частый, прошу не ругать :)
dwTotalPhys - получаю без проблем (ОК!)
dwMemoryLoad - получаю 100 ???
dwAvailPhys - получаю оочень маленькое число ???

var
MS : TMemoryStatus;
begin
GlobalMemoryStatus(MS);
lblPhysMem.Caption := FormatFloat("#,###" KB"", MS.dwTotalPhys / 1024);

lblFreeRes.Caption := IntToStr(MS.dwMemoryLoad);
Так в чём же проблема?


 
Юрий Зотов ©   (2002-08-04 18:04) [1]

Из справки:

dwLength
Indicates the size of the structure. The calling process should set this member prior to calling GlobalMemoryStatus.

То есть, СНАЧАЛА
MS.dwLength := SizeOf(MS)
а уж потом
GlobalMemoryStatus(MS);

Иначе можно получить любой мусор. Что и наблюдается.


 
^Sanya ©   (2002-08-04 18:28) [2]

А можно узнать почему нужно определять размер структуры? Я просто всегда в суть смотрю...


 
^Sanya ©   (2002-08-04 18:46) [3]

Проблема не решилась :(

dwAvailPhys вощвращает маленькое число... в несколько раз меньше реального

procedure TfrmAbout.tmrMemInfoTimer(Sender: TObject);
var
MS : TMemoryStatus;
begin
MS.dwLength := SizeOf(MS);
GlobalMemoryStatus(MS);
lblPhysMem.Caption := FormatFloat("#,###" KB"", MS.dwTotalPhys / 1024);

lblFreeRes.Caption := IntToStr(MS.dwAvailPhys);

end;
Подскажите, что делать? В чём моя ошибка? Ведь dwTotalPhys работает, правда он "статичен"?


 
TTCustomDelphiMaster ©   (2002-08-04 19:33) [4]

^Sanya © (04.08.02 18:46)

dwLength
Size of the MEMORYSTATUS data structure, in bytes. You do not need to set this member before calling the GlobalMemoryStatus function; the function sets it.

dwMemoryLoad
Windows NT 4.0 and earlier: The percentage of approximately the last 1000 pages of physical memory that is in use.
Windows 2000/XP: The approximate percentage of total physical memory that is in use.

dwAvailPhys
Size of physical memory available, in bytes.

<<MSDN Library - January 2002>>

Если у тебя занято 100% физической памяти, то какие вопросы могут быть. Приведи полученные данные и реальные (и что используешь для получения реальных данных + какая OS).


 
Юрий Зотов ©   (2002-08-04 19:55) [5]

У меня тот же код нормально работает (D5, WinME).

procedure TForm1.Button1Click(Sender: TObject);
var
MS: TMemoryStatus;
begin
MS.dwLength := SizeOf(MS);
GlobalMemoryStatus(MS);
lblPhysMem.Caption := FormatFloat("#,###" KB"", MS.dwTotalPhys / 1024);
lblFreeRes.Caption := FormatFloat("#,###" KB"", MS.dwAvailPhys / 1024);
end;

Результат:
Phys = 458,220 K // Стоят 3 модуля: 256, 128 и 64 М
Free = 239,292 K // Запущены IE, Delphi и этот проект

IMHO, цифры вполне реальные. Похоже, у Вас дело в чем-то другом.


> почему нужно определять размер структуры?

Это стандартная закладка MS. Они закладываются на то, что в разных версиях системы состав структуры может меняться, поэтому первым полем ставят ее размер. Получив его, вызванная функция может правильно заполнить все остальные поля. В API так работают многие функции.

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



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

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

Наверх




Память: 0.48 MB
Время: 0.01 c
4-48370
ATLANTIDO
2002-06-03 16:12
2002.08.15
priority


3-47972
Ш-К
2002-07-26 11:38
2002.08.15
Динамически меняемая БД.


7-48340
Megadeth
2002-06-03 19:01
2002.08.15
S.M.A.R.T


1-48172
FLIZ
2002-08-01 23:34
2002.08.15
как узнать сколько занимают в памяти поля объекта?


1-48083
Dinara
2002-07-31 23:29
2002.08.15
Как из второго экземпляра программы послать первому сообщение?...