1

私は QScintilla のオブジェクトを使用しており、QScintilla オブジェクトのファイルをインクリメンタルに読み取っています。

ヘッダー myEditor.h

class myScintilla: public QScintilla {
     public readFile();
};

#include  "myEditor.h"
void myEditor::readFile() {

   if (FILE* fp = fopen(ofilename.toLatin1(), "r")) {
    QTextStream ts(fp, QIODevice::ReadOnly);
    int bufferSize =(1024* 1024)/2;
    do {
      QString s = ts.read(bufferSize);
      append(s);
    } while(!ts.atEnd());
}

この変更の後でも、大きなファイルの読み取り中にパフォーマンスの問題が発生します。かかった

1) サイズ 1.5 GB のファイルを読み取るのに 25 秒。(マシン コア 4 、16 GB RAM) 2 10 秒のサイズ 512MB のファイル (同じマシン上)

スクロールバーの動きに基づいて QScintilla オブジェクトにファイルを段階的にロードする方法はありますか?

4

1 に答える 1

1

あなたの質問が興味深いと思ったので、あなたに代わって少しグーグルをしました。Scintilla はLoader インターフェースを介してこの機能を公開していますが、実際にはQScintillaクラスは公開していないようです。これを機能させるには、QScintillaBaseクラスを使用してSCI_CREATELOADERメッセージを Scintilla コントロールに送信する必要があるようです。

append編集:また、ループで使用したくありません。それは、あらゆる種類の恐ろしいことを引き起こすでしょう。レンダリングやある種のインデックス作成などが強制される可能性があります。上記の私の提案を使用する前に、メモリ内に巨大な QString を構築し、最後にそれを設定することをお勧めします。事前に割り当てたほうがよいでしょう。その方が少し早いかもしれません。

最終的な答え

編集 #2: OK、Scintilla のような工業用の強力なエディター コンポーネントがこれをネイティブにサポートしていないことは気になりましたが、これを行う正しい方法は、機能の組み合わせを使用することです。

  1. SCI_ALLOCATEバイト数がファイルのサイズである場所を使用して割り当てられたドキュメントから始めます
  2. SCN_UPDATEUIあなたはイベントをリッスンします
  3. 次に、ユーザーがスクロールしている場所に基づいて、そのデータをロードします

QScintillaBase上記をテストとしてマッピングするのは簡単です。

于 2016-06-10T12:09:43.027 に答える