2016-06-10 2 views
1

Я использую объект QScintilla, и я читаю файл в QScintilla Object поэтапно.Инкрементная загрузка в объекте 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) 25 секунд, чтобы прочитать файл размером 1,5 ГБ. (Ядра ядра 4, 16 ГБ ОЗУ) 2 10 секунд файла размером 512 МБ (на том же компьютере)

Можно ли каким-либо образом загрузить файл в объекте QScintilla поэтапно на основе перемещения полосы прокрутки?

ответ

1

Я нашел ваш вопрос интересным, так что у вас было немного Googling. Мне кажется, что, хотя Scintilla предоставляет эту функциональность через Loader interface, на самом деле класс QScintilla этого не делает. Чтобы сделать эту работу, кажется, что вам нужно будет использовать класс QScintillaBase для отправки сообщения SCI_CREATELOADER в элемент управления Scintilla.

Редактировать: Кроме того, вы не хотите использовать append в цикле. Это вызовет всевозможные ужасные вещи. Скорее всего, это приведет к рендерингу, некоторому индексированию и т. Д. Прежде чем использовать мое предложение выше, я бы предположил, что вместо этого вы создадите гигантский QString в памяти и затем установите это в конце. Лучше предварительно выделить. Это может быть немного быстрее.

окончательный ответ

Edit # 2: Хорошо, это беспокоит меня, что такое промышленная сила компонента редактор как Scintilla не поддерживает это изначально, но, кажется, что правильный способ сделать это с помощью сочетание функций:

  1. Вы начинаете с документом выделен с помощью SCI_ALLOCATE, где число байт является размером файла
  2. Слушает для SCN_UPDATEUI события
  3. Затем, на основе которых пользователь прокруткой, вы загружаете, что данные

Это должно быть просто отобразить выше, чтобы QScintillaBase в качестве теста.

+0

Как я понимаю, я использую объект класса QScintillaBase, и внутри этого объекта я должен выполнить все 1, 2, 3 этапа финального ответа. Поскольку я очень новичок в QScintillaBase, QScintilla, если бы вы могли указать мне пример примера, используя описанный выше подход, как указано в вашем ЗАКЛЮЧИТЕЛЬНОМ ОТВЕТЕ – TechEnthusiast

+0

, я узнал только о QScintilla/Scintilla сегодня! Я знаю даже меньше тебя. Все, что я говорю, это то, что кажется возможным, если вы попробуете мое предложение. – cheez

Смежные вопросы