Конференция "Основная" » Свободная память + TStringGrid [D7, WinXP]
 
  • Student (15.06.08 16:14) [0]
    Господа Мастера!
    Необходимо определить момент, когда при увеличении StringGrid.RowCount и записи ячеек Delphi не сможет выделять память.
    Есть программа (отладка + тест некоего оборудования), работающая в разных режимах: оперативный показ полного лога, только ошибки, отсутствие показа (вывод лога в файл), ...
    В начале отладки, когда железо еще неработоспособно, оперативный вывод информации в грид очень удобен. Когда ошибки пофиксили, тест идет долго (~сутки). Понятно, что в этом случае включать вывод в грид не следует (не информативно, да и скорость падает), но юзеру не запретишь, а программа падает.
    Хотелось бы перед тем, как доступной памяти станет мало, вывести соответствующий диалог и переключить отображение в лог-файл. Пробовал:

    var Memory: TMemoryStatus;
    ...
     GlobalMemoryStatus(Memory);
     if Memory.dwAvailVirtual < MinMemAvail then ... // MinMemAvail = 256M


    Работает, но непонятно, как правильно подобрать MinMemAvail.
    Уверен, есть более правильный, простой и быстрый способ.
  • Сергей М. © (15.06.08 16:44) [1]

    > Необходимо определить момент, когда при увеличении StringGrid.
    > RowCount и записи ячеек Delphi не сможет выделять память


    В этот момент будет возбуждено исключение класса EOutOfMemory.
    Все что требуется - перехватить и обработать его должным образом.
  • Student (15.06.08 23:39) [2]
    Исключение (памяти не осталось) - уже поздно. Дальнейшие телодвижения (диалоговые окна, ...) также требуют немного памяти - может не получиться.
    Хотелось бы поймать момент, когда память еще есть, но скоро кончится (было бы достаточно запаса 2М)
  • Германн © (16.06.08 01:07) [3]

    > Student   (15.06.08 23:39) [2]
    >
    > Исключение (памяти не осталось) - уже поздно. Дальнейшие
    > телодвижения (диалоговые окна, ...) также требуют немного
    > памяти - может не получиться.
    > Хотелось бы поймать момент, когда память еще есть, но скоро
    > кончится (было бы достаточно запаса 2М)
    >

    Что-то не так в Датском королевстве. Какая-то перемудренная  логика.
    Почему-бы не держать в гриде не более N строк при "оперативнои выводе информации"? При достижении этого числа скидывать M самых старых записей в лог. Ведь никакому юзеру никакой пользы нет от грида с туевой хучей строк. Он в них утонет!
  • MsGuns © (18.06.08 00:41) [4]
    Память - она как водка - никогда не угадаешь когда закончится
  • Германн © (18.06.08 01:48) [5]

    > MsGuns ©   (18.06.08 00:41) [4]
    >
    > Память - она как водка - никогда не угадаешь когда закончится
    >

    В нынешнюю эпоху это сравнение не выдерживает никакой критики. Водку можно докупить всегда, в любое время суток, в любом количестве. :)

    P.S. Кроме Ульяновской области.
  • palva © (18.06.08 09:25) [6]

    > Student   (15.06.08 16:14)  

    Во времена DOS был смысл максимально использовать оперативную память, чтобы минимизировать обращения к диску. Но и тогда были надстройки над ОС, делавшие такое стремление сомнительным. Теперь это вовсе не имеет смысла, поскольку задолго до исчерпания той памяти, о которой вам сообщает программа, появятся трудности с физической оперативной памятью, и ваша программа фактически перейдет в режим очень активной работы с файлом подкачки, что сильно замедлит работу. Если бы вы, зная логику обработки, сами распорядились работой с диском, то скорее всего замедление не было бы таким катастрофическим. Надеюсь, что вы все это понимаете, и ваш вопрос не связан с реальной программой, а вызван чисто академическим интересом.

    Программу лучше не выводить на режими максимального использования ресурсов, чтобы она давала дышать другим программам и службам, работающим на компьютере.
  • Ega23 © (18.06.08 10:50) [7]

    > В нынешнюю эпоху это сравнение не выдерживает никакой критики.
    >  Водку можно докупить всегда, в любое время суток, в любом
    > количестве. :)
    >
    > P.S. Кроме Ульяновской области.


    Щаз. У нас в Дубне уже года 2 как с 23 до 8 утра не продают ничего крепче 13 градусов.
  • Anatoly Podgoretsky © (18.06.08 14:06) [8]
    > palva  (18.06.2008 9:25:06)  [6]

    если загнать в TStringGrid по максимуму, но чуть меньше, то пользователь давно до этого подохнет.
 
Конференция "Основная" » Свободная память + TStringGrid [D7, WinXP]
Есть новые Нет новых   [134491   +12][b:0][p:0.001]