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

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

TMemoryStatus - объясните, пожалуйста [D6, Win95/98]


^SANYA ©   (2002-08-04 17:47:00) 

Вопрос частый, прошу не ругать :)
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 19:55:00) [1]

У меня тот же код нормально работает (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 так работают многие функции.

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


TTCustomDelphiMaster   (2002-08-04 19:33:00) [2]

^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).


^Sanya   (2002-08-04 18:46:00) [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 работает, правда он "статичен"?


^Sanya   (2002-08-04 18:28:00) [4]

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


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

Из справки:

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

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

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


Наверх

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