3

我正在使用 CodeGear C++ Builder 2009 并且遇到了 TMemo 组件的问题。它太慢了。我用它来显示来自 COM 串行端口的 ASCII 文本。当它来自 COM 串行端口时,我需要显示每个符号。问题是,如果来自 COM 串行端口的文本很多,则 TMemo 上的旧文本开始闪烁,并且组件上的文本越多,情况就越糟糕。当 TMemo 包含 1000 行文本时,刷新延迟是巨大的!

我将 doubleBuffered 属性设置为 true,但这无济于事。他们如何使 SecureCRT 等应用程序的刷新时间最短?新文本添加流畅,没有闪烁。哪个组件可以产生这样的结果?

4

2 回答 2

1

与其在字符到达时实时显示到 TMemo 中,不如先尝试将它们保存到内存缓冲区中,然后让一个短计时器定期将缓冲区复制到 TMemory 中,并在添加时使用Lines->BeginUpdate()andLines->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();
    }
}
于 2011-09-22T20:24:13.667 回答
0

至于窗口设备,. . 最好的方法是使用线程事件而不是计时器事件,. . 在里面放置串行等待事件thread->execute(),(这是一个do while循环,......)

串行等待事件在收到某些东西之前什么都不做,.. 很快它收到了*buffer,检查缓冲区/字符串的长度,。.

然后放在备忘录中

memo->text=buffer;
or 
memo->lines-add(buffer);
于 2013-05-31T03:37:54.127 回答