У меня есть старое приложение Doc / View C ++ / MFC, которое разработано с использованием VS 6.
В качестве сетки данных я использую Stingray Objective Grid 8.01 Pro.
В последнее время наши размеры «работы» стали намного больше; и это, когда начали появляться ошибки «Недостаточно памяти».
Вот сценарий, который дает мне ошибку нехватки памяти:
К вашему сведению, когда я говорю, что я загружаю работу в сценарии ниже; это означает, что я читаю БД и загружаю данные, связанные с этим заданием, в память, используя пользовательские классы, которые хранят данные в объектах CArray и CList; который хранится в классе документа. Кроме того, я храню некоторые из этих данных в двух сетках StingRay в главном представлении для этого документа.
Когда я впервые открываю приложение, оно показывает около 21 МБ памяти в Task Mgr.
Я начинаю с загрузки обычной работы, и приложение занимает около 40 МБ.
Затем я загружаю «большую» работу, а затем приложение увеличивается до 159 МБ.
Затем я закрываю «большую» работу, и приложение падает примерно до 40 МБ.
Затем я снова загружаю ту же «большую» работу, и она возвращается примерно к 159 МБ.
Затем я открываю немодальное окно, которое содержит сетку StingRay и заполняю сетку данными из работы. Когда это происходит, использование памяти приложения увеличивается до 1421 МБ.
Затем я закрываю немодальное окно, и оно возвращается примерно к 163 МБ.
Затем я закрываю «большую» работу, и она возвращается примерно к 45 МБ.
Затем я пытаюсь снова открыть ту же «большую» работу, и когда я начинаю перезагружать сетки Stingray в главном окне (не в немодальном окне), я получаю ошибку «Недостаточно памяти». В этот момент приложение показывает около 170 МБ в диспетчере задач.
Поскольку я могу без каких-либо проблем закрывать и открывать задания, я могу предположить, что это происходит только при загрузке данных в сетку Stingray в немодальном окне; что-то не освобождается; но если это так, то почему мое использование памяти в диспетчере задач возвращается к почти нормальному уровню после закрытия немодального окна. Это только около 5 МБ больше после закрытия немодального окна.
Что мне действительно нужно, так это несколько советов о том, как попытаться определить, почему я получаю сообщение об ошибке «Недостаточно памяти», когда мое приложение использует только 160 МБ, когда оно говорит о нехватке памяти.
Любая помощь будет оценена.
Спасибо,
Фил
Получение 1421 МБ при загрузке сетки неудобно близко к диапазону адресов 2 ГБ, который вы можете использовать в 32-разрядном приложении. Конечно, верное решение — стать 64-битным приложением, если это возможно. Другая вещь, которую вы можете попробовать, это использовать виртуальный режим сетки, чтобы сетка не дублировала данные. В виртуальном режиме вы получаете обратный вызов для каждой окрашиваемой строки или ячейки и передаете ей данные из вашего хранилища документов.
Других решений пока нет …