Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c