Инкрементная загрузка в объекте QScintilla

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

Есть ли способ загрузить файл в объект QScintilla постепенно, основываясь на движении полосы прокрутки?


person TechEnthusiast    schedule 10.06.2016    source источник


Ответы (1)


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

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

ЗАКЛЮЧИТЕЛЬНЫЙ ОТВЕТ

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

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

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

person Sohail    schedule 10.06.2016
comment
Насколько я понимаю, я использую объект класса QScintillaBase, и внутри этого объекта я должен выполнить все 1,2,3 шага Final Answer. Поскольку я очень новичок в QScintillaBase, QScintilla, не могли бы вы указать мне пример примера с использованием вышеуказанного подхода, как указано в вашем ПОСЛЕДНЕМ ОТВЕТЕ - person TechEnthusiast; 11.06.2016
comment
Я узнал о QScintilla/Scintilla только сегодня! Я знаю еще меньше, чем ты. Все, что я говорю, это то, что это кажется возможным, если вы попробуете мое предложение. - person Sohail; 11.06.2016