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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Тормозит QSqlTableModel  (Прочитано 9102 раз)
Yegor
Гость
« : Июль 09, 2013, 14:54 »

Здравствуйте!

Есть таблица в БД, которую отображаю в приложении с помощью QSqlTableModel (только для просмотра).

Делаю
Код:
m_pModel->setEditStrategy(QSqlTableModel::OnManualSubmit)
чтобы данные автоматически не сохранялись при манипуляции с моделью.

Данные в таблице БД добавляются извне. Я, чтобы эти новые данные отобразить,  одновременно эти же данные вставляю модель с помощью:    
Код:
    //New row.
    m_pModel->insertRows(0, 1);

    //date_time
    index = m_pModel->index(0, 0);
    m_pModel->setData(index, cur_date_time);
    
    //data_unit.
    index = m_pModel->index(0, 1);
    m_pModel->setData(index, data_unit);

Я не делаю
Код:
m_pModel->select()
- потому что это медленно (если накопилось много данных), а просто вставляю данные в модель программно
Код:
m_pModel->insertRows(0, 1)
.

Но если в таблице базы данных накопилось много данных, то это программное добавление сильно тормозит программу. Тем сильнее, чем больше накопленных данных (десятки тысяч) и чаще программное добавление (50 в секунду).

Я попробовал поменять модель - на QSqlQueryModel. Но она не подходит, потому что там не работает insertRow.

Вопрос: как сделать, чтобы модель не тормозила?
« Последнее редактирование: Июль 14, 2013, 17:31 от Yegor » Записан
VPS
Гость
« Ответ #1 : Июль 09, 2013, 15:43 »

Непонятен смысл вот этого предложения: "Я, чтобы эти новые данные отобразить,  одновременно эти же данные их в модель с помощью:..."
Также, что Вы имеете в виду под: "Данные в таблице БД добавляются извне"; из другого метода или программы?
Записан
Yegor
Гость
« Ответ #2 : Июль 09, 2013, 16:24 »

Да, вставляю из другого метода.
Подскажите, пожалуйста, какие нибудь соображения, чтобы ускорить модель.
Записан
VPS
Гость
« Ответ #3 : Июль 09, 2013, 19:33 »

Вам тут, наверное, нужно распараллеливать задачи.
Может это чем-то поможет.
Записан
joker
Новичок

Offline Offline

Сообщений: 49


Просмотр профиля
« Ответ #4 : Июль 10, 2013, 07:32 »

Мне вот непонятно:
 - по мелочи - отображаешь же через QTableView? Может он и тормозит?
 - зачем руками добавлять строки - чтобы не перечитывать уже существующие строки. Тогда хотя бы проверь производительность своих действий (считай стандартными средствами табличку и по-твоему и измерь время - может тут надо искать? )
 - А может не так уж и нужно отображать столько строк - пользователь все равно больше десяти-двадцати не воспринимает?
Записан
Bepec
Гость
« Ответ #5 : Июль 10, 2013, 07:36 »

Я думаю известная проблема - что обновляете вы всю таблицу разом. Хотя кто вас знает - код не врёт, но кода нету Веселый
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Июль 10, 2013, 10:25 »

Вопрос: как сделать, чтобы модель не тормозила?
отсмотреть профайлером узкие места и принять решение по ним.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Bepec
Гость
« Ответ #7 : Июль 10, 2013, 10:41 »

Жаль только что нормальных профайлеров под окна немного Грустный
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Июль 10, 2013, 11:32 »

>>чем больше накопленных данных (десятки тысяч)
а нефиг их в таком кол-ве туда совать.

Оригинальная модель никогда столько за один присест не тянет. Используй нормальный способ с селектом.
Записан

Юра.
Yegor
Гость
« Ответ #9 : Июль 10, 2013, 12:15 »

Мне желательно отображать все данные.
А что такое "нормальный способ с селектом"?
« Последнее редактирование: Июль 10, 2013, 12:17 от Yegor » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июль 10, 2013, 14:06 »

заполнять модель методом select(), с ним не может ничего тормозить, т.к. он тянет только первые 300 записей, а остальные тянет только когда пользователь прокручивает таблицу.
Записан

Юра.
Yegor
Гость
« Ответ #11 : Июль 10, 2013, 17:52 »

Заполнять модель методом select() не подходит, так как это тормозит еще больше, чем insertRow, setData.
Записан
Yegor
Гость
« Ответ #12 : Июль 14, 2013, 17:31 »

Проблему решил следующим образом: делаю select() модели каждые 10 секунд, с помощью таймера. Теперь все данные в модели обновляются, и не тормозит систему.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Июль 14, 2013, 17:34 »

>делаю select() модели каждые 10 секунд
извращенец, других слов просто нет
Записан

Юра.
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #14 : Июль 15, 2013, 00:41 »

>делаю select() модели каждые 10 секунд
извращенец, других слов просто нет
В 1Cv77 - 10 секунд по умолчанию. Но настраивается.
Называется "Период опроса изменений Базы Данных (сек.):"
Но там целая система кешей и оптимизаций.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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