Я пишу приложение для ведения журнала, которое получает данные и печатает журнал в поле wxRichTextCtrl с цветными линиями. Сначала я сохраняю строки журнала в векторе структур, содержащих как текст, так и информацию о цвете, затем событие wxTimer () запускает функцию, которая читает содержимое вектора и добавляет его в окно расширенного текста.
Когда буфер форматированного текста достигает 250 строк, я удаляю самую старую строку, чтобы в окне журнала всегда отображалось максимальное количество 250 строк. Очевидно, однако, это не освобождает память. Рассматривая использование памяти моим исполняемым файлом в диспетчере задач, я вижу увеличение используемой памяти при каждой новой строке, даже если программа правильно удаляет самые старые строки. Это известная ошибка wxRichTextCtrl?
Вот выдержка из моего кода:
Объявления:
wxRichTextCtrl *lstEventList;
// A vector of structures, a nice way to create a multi-dimensional vector
struct MidiLogStruct { wxString Text; wxColour Color; };
vector<MidiLogStruct> MidiLog;
В функции регистрации:
// eventLog is a wxString object containing the text
// eventColor is a wxColour object defining the text color
const MidiLogStruct thisLog = {eventLog, eventColor};
MidiLog.push_back(thisLog);
В функции таймера заполняется поле дисплея:
// Show all data stored in buffer
for (unsigned int i=0; i < MidiLog.size(); ++i)
{
lstEventList->SetInsertionPointEnd(); // Set cursor after the last character
lstEventList->Newline(); // Add a new CRLF
lstEventList->BeginTextColour(MidiLog[i].Color); // Set text color
lstEventList->WriteText(MidiLog[i].Text); // Write text
lstEventList->ShowPosition(lstEventList->GetLastPosition()); // Make sure the last line is in view
}
// Clear buffer
MidiLog.clear();
// Delete all lines that exceed the max NUMOFMIDILOGLINES
if (lstEventList->GetNumberOfLines() > NUMOFMIDILOGLINES)
lstEventList->Delete(wxRichTextRange(0, lstEventList->XYToPosition(0, lstEventList->GetNumberOfLines() - NUMOFMIDILOGLINES)));
Задача ещё не решена.
Других решений пока нет …