Главная страница
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.015 c
14-48306
Evyshka
2002-07-22 17:04
2002.08.15
Evyshka Я не блондинка


3-47928
Explorer
2002-07-25 10:11
2002.08.15
Запрос на Max значения


3-47964
basic
2002-07-26 12:44
2002.08.15
Надо линк RxLib


3-47917
the-best-officeman
2002-07-28 21:54
2002.08.15
Как поставить в таблицу вместо True(Flase). флажок - CheckBox ?


4-48366
antonp
2002-06-10 22:41
2002.08.15
Как узнать Id процесса?