Переполнение многострочного текстового поля в C ++ в форме Windows - PullRequest
0 голосов
/ 10 декабря 2018

В моей программе есть текстовое поле журнала, содержание которого увеличивается и увеличивается по мере запуска программы.У меня не было времени, чтобы проверить это самостоятельно, но мне было интересно, как текстовое поле обрабатывает тонны текста.Это исчерпает память или как-то автоматически освободит часть из этого?Если это не выполняется автоматически, каков лучший способ справиться с этим самостоятельно, а не просто очищать журнал время от времени?

Редактировать: Я использую проект Visual Studio 2013 CLR с формами Windows

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Текстовое поле будет просто принимать все больше и больше текста, пока не закончится свободная память.Чтобы смягчить это, вы можете установить ограничение в вашем коде для количества символов / строк, которые вы выбираете для отображения.Как только вы достигнете предела, удалите старые данные перед добавлением новых данных.

В противном случае, если вам нужно отобразить весь возможный текст при минимальном использовании памяти, рассмотрите возможность переосмысления своей стратегии пользовательского интерфейса.

ДляНапример, у меня есть приложение, которое отображает файлы журнала, которые могут быть размером до нескольких ГБ.Я использую виртуальный ListView для отображения текста, где я сохраняю текст видимый , буферизованный в памяти, и (не) загружаю невизуальный текст динамически, когда пользователь прокручивает список ListView.Это позволяет максимально сократить использование памяти до нескольких МБ, но при этом обеспечивает доступ ко всему журналу.

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

0 голосов
/ 10 декабря 2018

Я предлагаю вам использовать связанный список ваших данных журнала для этого.Например:

struct LogData{
 int time;
 Int catagory;
 char * string;
}
struct LogNode {
LogData data;
LogNode* nextLog;
}

Вы использовали nextLog с помощью NULL, а когда у вас есть другая вещь, которую вы хотите зарегистрировать, вы создаете новый LogNode и инициализируете его с вашими LogData и NULL.Распределение кучи рекомендуется, когда вы не знаете, сколько данных вам действительно нужно.Сохраняя указатель на первый logNode, вы можете получить доступ ко всем узлам журнала.

Текстовое поле realloc памяти при необходимости.поскольку текстовое поле находится в куче, ему не нужно знать, сколько памяти он будет использовать, и, как следует из названия, динамическое выделение предполагает, что оно может выделять память динамически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...