我正在使用CodeGear c++ Builder 2009,并且在TMemo组件上有问题。它太慢了。我用它来显示来自COM串行端口的ASCII文本。我需要显示每一个符号,当它来自COM串口。问题是,如果有很多来自COM串行端口的文本,TMemo上的旧文本开始闪烁,并且组件上的文本越多,情况就越糟。当TMemo包含1000行文本时,刷新延迟是巨大的!
我设置了doubleBuffered属性为true,但这并没有帮助。他们如何在SecureCRT等应用程序中使刷新时间最小化?新的文字添加平滑,没有闪烁。哪个成分会产生这样的结果?
而不是在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();
}
}
对于窗口设备,…最好的方法是使用线程事件而不是定时器事件。在thread->execute()
中放置串行等待事件,(这是一个do while循环,…)
serial wait事件将不做任何事情,直到收到某事,…很快它接收到一个*buffer
,检查缓冲区/字符串的长度,. .
然后将memo作为
memo->text=buffer;
or
memo->lines-add(buffer);