Вместо того, чтобы отображать символы в реальном времени в TMemo по мере их поступления, попробуйте сначала сохранить их в буфере в памяти, а затем с коротким таймером периодически копировать буфер в TMemory и использовать Lines->BeginUpdate()
и Lines->EndUpdate()
методы при добавлении нового текста.Кроме того, 1000 строк это много, возможно, вам придется начать удалять старые строки, так как новые строки добавляются через некоторое время.Я обычно ограничиваю свои TMemo
элементы управления несколькими сотнями строк за раз.
Обновление: попробуйте что-то вроде этого:
TMemoryStream *Buffer;
// serial port callback
void BytesReceived(void *Data, int Length)
{
Buffer->Position = Buffer->Size;
Buffer->WriteBuffer(Data, Length);
}
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
Buffer = new TMemoryStream;
}
__fastcall TForm1::~TForm1()
{
delete Buffer;
}
void __fastcall TForm1::TimerElapsed(TObject *Sender)
{
if (Buffer->Size > 0)
{
Memo1->Lines->BeginUpdate();
Memo1->SelStart = Memo1->GetTextLen();
Memo1->SelLength = 0;
Memo1->SelText = AnsiString((char*)Buffer->Memory, Buffer->Size);
Memo1->SelStart = Memo1->GetTextLen();
Memo1->Perform(EM_SCROLLCARET, 0, 0);
Memo1->Lines->EndUpdate();
Buffer->Clear();
}
}