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++ - 如何在现有 Windows 应用程序中获得 ATL 支持

c# - 多线程比单线程慢

delphi - TDateTimePicker MaxDate - 不允许将控件设置为当前日期

c++ - 在 C++ 生成器中向 StringGrid 添加控件

c++ - 抑制状态错误 LNK1104 无法打开文件 'IlmImfd.lib'

c++ - QTreeWidgetItem : How can I get the selected item?

c++ - 如何阻塞线程直到一个函数在另一个线程中返回?

mysql - 用于快速更改大文本字段的最佳 MySQL 设置?

c++ - 访问嵌套数据结构的最佳方式?

c++ - 编译器错误帮助(E2209 无法打开包含文件)