2016-06-10 13 views
1

Ich benutze ein Objekt von QScintilla und lese die Datei in QScintilla Object inkrementell.Inkrementelles Laden in QScintilla Objekt

Kopf 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()); 
} 

Auch nach dieser Änderung wird es noch Performance-Problem sein, während große Dateien zu lesen. Es dauerte etwa

1) 25 Sekunden, um eine Datei der Größe 1,5 GB zu lesen. (Maschinenkerne 4, 16 GB RAM) 2 10 Sekunden Datei der Größe 512MB (auf demselben Rechner)

Gibt es eine Möglichkeit, die Datei im QScintilla-Objekt inkrementell basierend auf der Bewegung der Bildlaufleiste zu laden?

Antwort

1

Ich fand Ihre Frage interessant, also ein wenig Googeln in Ihrem Namen. Es scheint mir, dass, während Scintilla diese Funktionalität über die Loader interface verfügbar macht, tatsächlich die QScintilla Klasse nicht tut. Damit dies funktioniert, scheint es, dass Sie die Klasse QScintillaBase verwenden müssen, um die Nachricht SCI_CREATELOADER an das Scintilla-Steuerelement zu senden.

Edit: Auch wollen Sie nicht append in einer Schleife verwenden. Das wird alle möglichen schrecklichen Dinge passieren lassen. Es wird wahrscheinlich das Rendern erzwingen, eine Art Indizierung, usw. Bevor ich meinen obigen Vorschlag benutze, würde ich vorschlagen, stattdessen einen gigantischen QString im Speicher aufzubauen und ihn dann am Ende einzustellen. Besser vorab zuzuweisen. Das könnte ein bisschen schneller sein.

FINAL ANSWER

Edit # 2: OK, es störte mich, dass eine solche industrielle Stärke Editor-Komponente wie Scintilla das nicht nativ unterstützt hat, aber es scheint, dass der richtige Weg, dies zu tun ist durch eine mit Kombination von Merkmalen:

  1. Sie mit einem Dokument starten teilten Siemens SCI_ALLOCATE, wo die Anzahl von Bytes, die Größe der Datei
  2. Sie für das SCN_UPDATEUI Ereignis hören ist
  3. Dann wird basierend auf, wo der Benutzer blättert, laden Sie die Daten

es einfach sein sollte, die oben auf QScintillaBase als Test abzubilden.

+0

Wie ich verstehe, verwende ich Objekt der Klasse QScintillaBase und innerhalb dieses Objekts sollte ich alle 1, 2, 3 Schritte der endgültigen Antwort. Da ich sehr neu in QScintillaBase bin, QScintilla, wenn Sie mir das Beispielbeispiel mit dem oben genannten Ansatz zeigen könnten, wie in Ihrer FINAL ANTWORT – TechEnthusiast

+0

erwähnt, habe ich erst heute über QScintilla/Scintilla erfahren! Ich weiß noch weniger als du. Alles was ich sage ist, dass es möglich scheint, wenn Sie meinen Vorschlag ausprobieren. – cheez