Russian Qt Forum

Qt => Model-View (MV) => Тема начата: neosapient от Июль 21, 2010, 13:58



Название: Помогите убрать дополнительные строки в таблице
Отправлено: neosapient от Июль 21, 2010, 13:58
Здравствуйте.

Есть большая таблица в БД, которую требуется перечитывать каждые n секунд.
Чтобы графика не подвисала на время обновления таблицы, я вынес её в дополнительный поток.
Проблема в том, что QTableView обображает таблицу, а затем ещё столько же пустых строк.
(http://s49.radikal.ru/i125/1007/e1/c474d9471909.png) (http://www.radikal.ru)

Откуда беруться эти дополнительные строки ?
Как от них избавиться ?

MyThread.h
Код:
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QSqlQueryModel>

class MyThread : public QThread
{
public:
    void run();
    QSqlQueryModel* MyThread::model();
protected:
    QSqlQueryModel m_model;
};
#endif

MyThread.cpp
Код:
#include "MyThread.h"

void MyThread::run()
{
    m_model.setQuery("select * from person");
    m_model.setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    m_model.setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
    m_model.setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}

QSqlQueryModel* MyThread::model()
{
    return (&m_model);
}

main.cpp
Код:
#include <QtGui>
#include "connection.h"
#include "MyThread.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (!createConnection())
        return 1;

    MyThread myThread;

    QTableView *view = new QTableView;
    view->setModel(myThread.model());
    view->resize(400,400);
    view->show();

    myThread.start();

    return app.exec();
}


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: lit-uriy от Июль 21, 2010, 16:16
>>Чтобы графика не подвисала на время обновления таблицы, я вынес её в дополнительный поток.
сто раз уже говорили, графику нельзя выносить из главного потока


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: neosapient от Июль 21, 2010, 16:56
>>сто раз уже говорили, графику нельзя выносить из главного потока

Так я и не выношу графику из главного потока. В отдельный поток я вынес обращение к БД.


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: lit-uriy от Июль 21, 2010, 18:19
модель у тебя точно в отдельном потоке не работает. Т.к. создана она в основном потоке, а в доп потоке ты в неё запрос устанавливаешь.
Может это и является виной пустых строк.


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: neosapient от Июль 21, 2010, 18:44
модель у тебя точно в отдельном потоке не работает. Т.к. создана она в основном потоке, а в доп потоке ты в неё запрос устанавливаешь.
Может это и является виной пустых строк.

Возможно.

Я могу создать модель в классе и вне класса MyThread (во втором случае мне следует передать указатель на модель в класс). Глюк не исчезает, так как во всех вариантах я выделяю память под модель в главном потоке, и это происходит прежде чем я запукаю поток для забора данных.
Моя цель - выполнять запрос к БД  в отдельном потоке, чтобы пользовательский интерфейс не подвисал.
По этой причине в дополнительном потоке устанавливаю запрос в модель. Я рассчитываю, что запрос будет выполняться в дочернем потоке. Или я заблуждаюсь и он будет выполняться ещё где то ?


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: lit-uriy от Июль 21, 2010, 19:06
Цитировать
Потоки и модуль SQL

Соединение может использоваться только внутри создавшего его потока. Перемещение соединений между потоками и создание запросов в другой поток не поддерживается.


Название: Re: Помогите убрать дополнительные строки в таблице
Отправлено: lit-uriy от Июль 21, 2010, 19:09
попробуй модель создать в отдельном потоке, может так будет работать. Либо создай соединение с БД, в том же потоке, где выполняешь запрос.

П.С.
В описании QSqlQueryModel нет упоминания о том, что функции этого класса реентерабельны. Т.е. их по идее нельзя вызывать в потоке отличном от потока самого объекта