CodeGear c++ Builder上有比TMemo更快的组件吗?
Is there a faster component than TMemo on CodeGear C++ Builder?
我正在使用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);
相关文章:
- 如何将 txt 文件中的行分隔为组件C++
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 到连接组件算法的问题(递归)
- 两个 COM 组件中 ENUM 的重复条目
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何在ECS框架中更新组件数据和通知系统
- 如何从ECS中的模板方法获取组件?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 在C++中访问蓝图类组件的正确方法是什么?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 提高基于组件的游戏引擎的效率
- 从组件的 std::type_index 获取派生最多的类型
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 如何通过 UActor组件获取演员列表?
- 在Visual Studio 2017中使用c ++组件构建python解决方案时出现问题
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- CodeGear c++ Builder上有比TMemo更快的组件吗?