Russian Qt Forum
Ноябрь 22, 2024, 17:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Создание модели на основе QAbstractTableView  (Прочитано 29241 раз)
Larry
Гость
« Ответ #15 : Март 25, 2016, 11:32 »

Засек время заполнения таблицы и получилось, что чтобы закинуть 1346 записей в таблицу требуется 287 секунд...надо уходить от QMap к другому контейнеру, чтобы выделять не по одной строке, а сразу необходимое количество строк, т.к. qmap не позволяет задать размер по умолчанию.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #16 : Март 25, 2016, 11:40 »

А вы там processEvent не вызываете?
Записан

Larry
Гость
« Ответ #17 : Март 25, 2016, 11:49 »

нет. Я думаю пока переделать на qvector, чтобы мог резервировать или потом делать resize. А сейчас получается в цикле 2000 объектов по одному заносятся.
Записан
Bepec
Гость
« Ответ #18 : Март 25, 2016, 11:52 »

Что то там у вас не то. Запись 2к объектов не может занимать столько времени...
Надо будет на досуге посмотреть.
Записан
Larry
Гость
« Ответ #19 : Март 25, 2016, 11:56 »

Спасибо. Буду рад помощи, т.к. с моделями начал недавно работать, то возможно где-то косячу. Проверил парсинг данных от сервера - потолок 25 мс, а вот заполнение сплошной тормоз. Сейчас переделаю на qvector и отпишусь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Март 25, 2016, 12:19 »

Засек время заполнения таблицы и получилось, что чтобы закинуть 1346 записей в таблицу требуется 287 секунд...надо уходить от QMap к другому контейнеру, чтобы выделять не по одной строке, а сразу необходимое количество строк, т.к. qmap не позволяет задать размер по умолчанию.
Что же Вы так безбожно QMap::keys вызываете на каждый чих? Это удовольствие дорогое, нужно кеш ставить.
Записан
Larry
Гость
« Ответ #21 : Март 25, 2016, 12:53 »

Спасибо большое. Сейчас попробую.
Записан
Larry
Гость
« Ответ #22 : Март 25, 2016, 14:36 »

Спасибо. На том минимальном работает без проблем, а вот в самом проекте все равно висит, хотя это уже где-то еще проблемы вылезли, т.к. первая загрузка модели от 39 до 230 мс была, а потом обновление  в пределах 6 с идет...Может траблы где в работе с сокетом...
Записан
Larry
Гость
« Ответ #23 : Март 25, 2016, 16:43 »

Нашел еще одно узкое место: при обновлении данных с сервера я не очищал контейнер и постоянно обновлял все данные. Теперь при обновлении получаю не больше 100 записей в секунду (при загрузке получаю все записи - 1928). Тормозит и проблему пока не могу найти, хотя на много лучше стало. При обновлении затрачивается не более 70 мс, а при полной загрузке в районе 230 мс. Где может еще быть слабое место?
Записан
Larry
Гость
« Ответ #24 : Март 25, 2016, 16:50 »

На минимально компилируемом проекте (тот что выкладывал) сделал тоже, что и в реальных условиях, т.е. выставил кол-во объектов 1928 и время обновления раз в секунду и получил те же тормоза...Что можно еще сделать, чтобы получить плавный скрол в таблице?
Записан
Bepec
Гость
« Ответ #25 : Март 25, 2016, 17:44 »

Мб я уже устарел морально, но зачем вы дёргаете setData и insertRows на каждую запись?
Вот это вообще мне непонятно
Код:
  
    setData(id, tindex, status.data.speed, Qt::DisplayRole);

    tindex = index(row, 2);
    setData(id, tindex, status.state_move, Qt::DecorationRole);

    tindex = index(row, 3);
    setData(id, tindex, status.state_battery, Qt::DecorationRole);

    tindex = index(row, 4);
    setData(id, tindex, status.state_satellite, Qt::DecorationRole);

    tindex = index(row, 5);
    setData(id, tindex, status.state_communication, Qt::DecorationRole);


Интересная штука - вы создаёте сначала 2к записей и запихиваете в map, а потом запихиваете уже в модель... Что мешает пихать сразу при создании?

PS или я реально не понимаю замысла всей этой модели Непонимающий

update: Oo а это зачем?
Код:
resizeColumnsToContents();
    resizeRowsToContents();
« Последнее редактирование: Март 25, 2016, 17:56 от Bepec » Записан
Larry
Гость
« Ответ #26 : Март 25, 2016, 17:57 »

Вы имеете ввиду сразу вставлять в модель, без map?
Записан
Bepec
Гость
« Ответ #27 : Март 25, 2016, 18:06 »

Заменяем
Код:
    QModelCars::statuses_t statuses;

    for(int i = 0; i < 2000; i++)
    {
        QModelCars::status_t status;

        status.data.speed = 10;
        status.state_battery = true;
        status.state_communication = true;
        status.state_move = true;
        status.state_satellite = true;

        statuses[i + 1000] = status;
    }

    for(int key: statuses.keys())
    {
        m_model->addCar(key, statuses[key]);
    }

    resizeColumnsToContents();
    resizeRowsToContents();
на
Код:
for(int i = 0; i < 2000; i++)
{
QModelCars::status_t status;

status.data.speed = 10;
status.state_battery = true;
status.state_communication = true;
status.state_move = true;
status.state_satellite = true;

//statuses[i + 1000] = status;
m_model->addCar(i, status);
}
И получаем обработку в 2-3 мс при частоте обновление 1с, 2к записей. Никаких лагов. Правда размер колонок вам придётся чуть подправить ручками, но там ничего сложного, от вашей задачи зависит.

PS resizeColumnsToContents(); и resizeRowsToContents(); - зло. Они проходят по всем записям таблицы, по всем ячейкам, вычисляют максимальное значение длины/высоты и после этого всего меняют размеры у них всех... Это ЗЛО Веселый *дьявольский смех*

PPS можно ещё и убрать создание объекта за цикл, сэкономим пару десятков наносекунд Веселый
Записан
Larry
Гость
« Ответ #28 : Март 25, 2016, 18:14 »

Цитировать
Интересная штука - вы создаёте сначала 2к записей и запихиваете в map, а потом запихиваете уже в модель... Что мешает пихать сразу при создании?
Вот после этого вопроса я реально прозрел Смеющийся. Наверное заработался, пора в отпуск:)...Спасибо большое - реально удалял гланды через ж...Улыбающийся
Записан
Larry
Гость
« Ответ #29 : Март 25, 2016, 18:16 »

Вопрос не по теме:
не могу поменять пароль, а старый не помню и поэтому не могу следить за темой с мобильника. Письмо с сылкой на почту не доходит!

Сори за вопрос не по теме...
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 23.