Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Проблема с открытием большого HTML файла, в QTextDocument & QTextEdit 
:(
    Опции темы
mosg
  Дата 16.11.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Добрый день!

Проблема в следующем: есть html-файл с размером 6Mb, структура которого представляет из себя записи в виде (ссылка|пояснение) и т.д. на 50 тыс. строк ...

Так вот не могу открыть этот документ в QTextDocument или QTextEdit! :( Точнее сказать - прога подвисает на целую эпоху, что не допустимо, и требуется время хотя бы 10-15 секунда на открытие этого документа. Понимаю что многое зависит от железа и загрузки машины, но дельфевые варианты открываются на этой же машине с тем же железом за доступные 10-15 секунд.

Как вариант рассматриваю дополнение html-строк в виджет, но как реализовать пока не представляю.

Пробую вот так: 
Код
    if (!QFile::exists(f))
        return;
    QFile file(f);
    if (!file.open(QFile::ReadOnly))
        return;

    QByteArray data = file.readAll();
    QTextCodec *codec = Qt::codecForHtml(data);
    QString str = codec->toUnicode(data);
    if (Qt::mightBeRichText(str)) {
        textBrowser->setHtml(str);
    } else {
        str = QString::fromLocal8Bit(data);
        textBrowser->setPlainText(str);
    }


Может быть кто сталкивался с такой проблемой?

Заранее спасибо за советы!
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
SABROG
Дата 16.11.2008, 13:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Попробуй метод setMaximumBlockCount(). Не уверен, что поможет и, возможно, где-то в другом месте начнет притормаживать, но тролли советуют использовать его для отображения логов, которые обычно бывают довольно большими. Сам не пробывал, поэтому не знаю будет ли возможен скроллинг. Как воторой и третий вариант можно посмотреть в сторону QTextBrowser и QWebKit, если не требуется редактирование.

И скорее всего бесполезные советы:
- setUpdatesEnabled(false);
         bigVisualChanges();
  setUpdatesEnabled(true);

-  QTextCursor::beginEditBlock();
   //вставка текста
   QTextCursor::endEditBlock();
  


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mosg
Дата 16.11.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Цитата(SABROG @  16.11.2008,  13:59 Найти цитируемый пост)
QWebKit

Да, начал крутить с этим модулем, но результаты пока не оченб внушительные, вместо 10-12 секунд, код: 
Код
webView = new QWebView;
QUrl url(guessUrlFromString(fileName));
webView->load(url);

Крепко подвисает на ~ 1 минуту 45 секунд, т.е. работает в 7! раз медленнее :( Хотя конечно надо ещё покопаться и найти информацию по оптимизации вызова webView->load(), т.к. в демо-примерах "Demonstration"|"Browser" тот же файл грузится около 30 секунд, что немного радует.

Да и варианты setUpdatesEnabled и подобных тут точно не канают.

Все равно спасибо за советы. Если найду максимально быстрый путь загрузки, код кину сюда обязательно.
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
SABROG
Дата 16.11.2008, 15:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Вот еще что подумал. Дебаг версия обычно медленнее чем Релиз. Какую тестируешь ?
Попробуй подключить код профайлера, если используешь gcc. Надо будет добавить это:

в .pro файл
Код

CONFIG(debug, debug|release) { 
    CONFIG += console
    DEFINES += debug__
    QMAKE_CXXFLAGS_DEBUG += -pg
    QMAKE_LFLAGS_DEBUG += -pg 
}


Потом запускаешь дебаг версию и ждешь, когда медленный участок кода отработает до конца. Выходишь из программы и ищешь новый файлик gmon.out. Подсовываешь его профайлеру:

Код

gprof program.exe gmon.out >> profiling.txt


И получаешь нечто похожее:

Код

             Call graph (explanation follows)


granularity: each sample hit covers 4 byte(s) for 0.06% of 15.81 seconds

index % time    self  children    called     name
                                                 <spontaneous>
[1]     99.4    3.72   11.99                 main [1]
                1.70    3.20 90000000/90000000     QList<unsigned int>::operator[](int) [2]
                0.77    3.26 90000000/90000000     QList<unsigned int>::operator<<(unsigned int const&) [3]
                0.91    2.01 90000000/90000000     QList<unsigned int>::at(int) const [5]
                0.00    0.11       1/1           TForm::TForm() [12]
                0.02    0.00       2/2           QList<unsigned int>::size() const [17]
                0.00    0.00       3/776         QLatin1String::QLatin1String(char const*) [28]
                0.00    0.00      17/2914        QString::~QString() [72]
                0.00    0.00       6/131         QString::QString() [97]
                0.00    0.00       3/775         QString::QString(QLatin1String const&) [86]
                0.00    0.00       2/61          QString::QString(char const*) [105]
                0.00    0.00       2/2           QDir::current() [402]
                0.00    0.00       2/872         operator new(unsigned int) [83]
                0.00    0.00       2/50          operator+(QString const&, QString const&) [110]
                0.00    0.00       1/2           QList<unsigned int>::QList() [413]
                0.00    0.00       1/97          operator+(QString const&, char const*) [101]
                0.00    0.00       1/2           operator|(QIODevice::OpenModeFlag, QIODevice::OpenModeFlag) [430]
                0.00    0.00       1/2           QWidget::show() [421]
                0.00    0.00       1/1           TForm::~TForm() [504]
                0.00    0.00       1/2           QList<unsigned int>::~QList() 


Т.е. тут видно, что дольше всего выполняется цикл из 90 миллионов итерация, на втором месте - конструктор главной формы.

Если узнаем где узкое место, то возможно сможем обойти его.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
mosg
Дата 16.11.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 3.3.2008
Где: Moscow

Репутация: 1
Всего: 1



Цитата(SABROG @  16.11.2008,  15:06 Найти цитируемый пост)
Попробуй подключить код профайлера

Завтра попробую на работе.

Да, я забыл совсем сказать, использую в основном debug. Результаты конечно будут отличаться, но мне почему-то никогда в голову не приходило, что дебаг версия будет в 2.5 раза медленее ...
PM MAIL WWW ICQ Skype GTalk Jabber YIM MSN   Вверх
JackYF
Дата 19.11.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(mosg @  16.11.2008,  15:31 Найти цитируемый пост)
что дебаг версия будет в 2.5 раза медленее ... 

Дебаг-версия может быть на порядок/полтора медленнее иногда, так что smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ldir
Дата 30.4.2013, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 13.11.2012

Репутация: 1
Всего: 1



Здравствуйте! Кто нибудь нашел решение? У меня та же проблема. Если кто знает способ побороть, хоть скажите куда глядеть.
PM MAIL   Вверх
Jeka178RUS
Дата 30.4.2013, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Для больших объемов данных сразу напрашивается поток (хотя как помню с гуями есть сложности) или читать по несколько строк, а потом вызывать processEvents руками, тем самым оживляя окно и обновляя progresBar с состоянием загрузки данных. Еще посмотри что тут пишут http://stackoverflow.com/questions/1386043...-thread-is-busy

Это сообщение отредактировал(а) Jeka178RUS - 30.4.2013, 12:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.