3

CodeGear C ++ Builder 2009を使用していますが、TMemoコンポーネントに問題があります。遅すぎます。COMシリアルポートからASCIIテキストを表示するために使用します。COMシリアルポートからのシンボルをすべて表示する必要があります。問題は、COMシリアルポートからのテキストが多い場合、TMemoの古いテキストがちらつき始め、コンポーネントにテキストが多くなるほど、悪化することです。TMemoに1000行のテキストが含まれている場合、更新の遅延は非常に大きくなります。

doubleBufferedプロパティをtrueに設定しましたが、これはすべての助けにはなりません。SecureCRTのようなアプリケーションでリフレッシュ時間を最小限に抑えるにはどうすればよいですか?新しいテキストがスムーズに追加され、ちらつきがありません。どのコンポーネントがそのような結果を生み出すことができますか?

4

2 に答える 2

1

到着した文字を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();
    }
}
于 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 に答える