我正在使用 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();
}
}
关于c++ - 在 CodeGear C++ Builder 上有比 TMemo 更快的组件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094903/