c++ - 在 CodeGear C++ Builder 上有比 TMemo 更快的组件吗?

标签 c++ performance c++builder tmemo

我正在使用 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/

相关文章:

c++ - 函数指针数组作为参数

c++ - 检查输入的类型是否正确

javascript - 检查未知对象中的对象是否存在的最有效 Javascript 方法

dll - TApplication 并将 C++Builder 应用程序拆分为 DLL

c++ - 无法让数组正确更新

c++ - 将文本编辑的滚动条移至顶部

mysql - 构建关注者/关注 MySQL 数据库的最佳实践

MySQL Select Slow 因为 Order By

c++ - 在知道墙壁在哪里的同时计算房间

c++ - 模块 'ntdll.dll' 中地址 * 的访问冲突。写地址 *