Russian Qt Forum

Qt => Базы данных => Тема начата: Yegor от Июль 09, 2013, 14:54



Название: [Решено] Тормозит QSqlTableModel
Отправлено: 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.

Вопрос: как сделать, чтобы модель не тормозила?


Название: Re: Тормозит QSqlTableModel
Отправлено: VPS от Июль 09, 2013, 15:43
Непонятен смысл вот этого предложения: "Я, чтобы эти новые данные отобразить,  одновременно эти же данные их в модель с помощью:..."
Также, что Вы имеете в виду под: "Данные в таблице БД добавляются извне"; из другого метода или программы?


Название: Re: Тормозит QSqlTableModel
Отправлено: Yegor от Июль 09, 2013, 16:24
Да, вставляю из другого метода.
Подскажите, пожалуйста, какие нибудь соображения, чтобы ускорить модель.


Название: Re: Тормозит QSqlTableModel
Отправлено: VPS от Июль 09, 2013, 19:33
Вам тут, наверное, нужно распараллеливать задачи.
Может это (http://www.linuxjournal.com/article/9602?page=0,0) чем-то поможет.


Название: Re: Тормозит QSqlTableModel
Отправлено: joker от Июль 10, 2013, 07:32
Мне вот непонятно:
 - по мелочи - отображаешь же через QTableView? Может он и тормозит?
 - зачем руками добавлять строки - чтобы не перечитывать уже существующие строки. Тогда хотя бы проверь производительность своих действий (считай стандартными средствами табличку и по-твоему и измерь время - может тут надо искать? )
 - А может не так уж и нужно отображать столько строк - пользователь все равно больше десяти-двадцати не воспринимает?


Название: Re: Тормозит QSqlTableModel
Отправлено: Bepec от Июль 10, 2013, 07:36
Я думаю известная проблема - что обновляете вы всю таблицу разом. Хотя кто вас знает - код не врёт, но кода нету :D


Название: Re: Тормозит QSqlTableModel
Отправлено: panAlexey от Июль 10, 2013, 10:25
Вопрос: как сделать, чтобы модель не тормозила?
отсмотреть профайлером узкие места и принять решение по ним.


Название: Re: Тормозит QSqlTableModel
Отправлено: Bepec от Июль 10, 2013, 10:41
Жаль только что нормальных профайлеров под окна немного :(


Название: Re: Тормозит QSqlTableModel
Отправлено: lit-uriy от Июль 10, 2013, 11:32
>>чем больше накопленных данных (десятки тысяч)
а нефиг их в таком кол-ве туда совать.

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


Название: Re: Тормозит QSqlTableModel
Отправлено: Yegor от Июль 10, 2013, 12:15
Мне желательно отображать все данные.
А что такое "нормальный способ с селектом"?


Название: Re: Тормозит QSqlTableModel
Отправлено: lit-uriy от Июль 10, 2013, 14:06
заполнять модель методом select(), с ним не может ничего тормозить, т.к. он тянет только первые 300 записей, а остальные тянет только когда пользователь прокручивает таблицу.


Название: Re: Тормозит QSqlTableModel
Отправлено: Yegor от Июль 10, 2013, 17:52
Заполнять модель методом select() не подходит, так как это тормозит еще больше, чем insertRow, setData.


Название: Re: Тормозит QSqlTableModel
Отправлено: Yegor от Июль 14, 2013, 17:31
Проблему решил следующим образом: делаю select() модели каждые 10 секунд, с помощью таймера. Теперь все данные в модели обновляются, и не тормозит систему.


Название: Re: [Решено] Тормозит QSqlTableModel
Отправлено: lit-uriy от Июль 14, 2013, 17:34
>делаю select() модели каждые 10 секунд
извращенец, других слов просто нет


Название: Re: [Решено] Тормозит QSqlTableModel
Отправлено: panAlexey от Июль 15, 2013, 00:41
>делаю select() модели каждые 10 секунд
извращенец, других слов просто нет
В 1Cv77 - 10 секунд по умолчанию. Но настраивается.
Называется "Период опроса изменений Базы Данных (сек.):"
Но там целая система кешей и оптимизаций.