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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите убрать дополнительные строки в таблице  (Прочитано 4037 раз)
neosapient
Гость
« : Июль 21, 2010, 13:58 »

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

Есть большая таблица в БД, которую требуется перечитывать каждые n секунд.
Чтобы графика не подвисала на время обновления таблицы, я вынес её в дополнительный поток.
Проблема в том, что QTableView обображает таблицу, а затем ещё столько же пустых строк.


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

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();
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июль 21, 2010, 16:16 »

>>Чтобы графика не подвисала на время обновления таблицы, я вынес её в дополнительный поток.
сто раз уже говорили, графику нельзя выносить из главного потока
Записан

Юра.
neosapient
Гость
« Ответ #2 : Июль 21, 2010, 16:56 »

>>сто раз уже говорили, графику нельзя выносить из главного потока

Так я и не выношу графику из главного потока. В отдельный поток я вынес обращение к БД.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июль 21, 2010, 18:19 »

модель у тебя точно в отдельном потоке не работает. Т.к. создана она в основном потоке, а в доп потоке ты в неё запрос устанавливаешь.
Может это и является виной пустых строк.
Записан

Юра.
neosapient
Гость
« Ответ #4 : Июль 21, 2010, 18:44 »

модель у тебя точно в отдельном потоке не работает. Т.к. создана она в основном потоке, а в доп потоке ты в неё запрос устанавливаешь.
Может это и является виной пустых строк.

Возможно.

Я могу создать модель в классе и вне класса MyThread (во втором случае мне следует передать указатель на модель в класс). Глюк не исчезает, так как во всех вариантах я выделяю память под модель в главном потоке, и это происходит прежде чем я запукаю поток для забора данных.
Моя цель - выполнять запрос к БД  в отдельном потоке, чтобы пользовательский интерфейс не подвисал.
По этой причине в дополнительном потоке устанавливаю запрос в модель. Я рассчитываю, что запрос будет выполняться в дочернем потоке. Или я заблуждаюсь и он будет выполняться ещё где то ?
« Последнее редактирование: Июль 21, 2010, 19:01 от neosapient » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 21, 2010, 19:06 »

Цитировать
Потоки и модуль SQL

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

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Июль 21, 2010, 19:09 »

попробуй модель создать в отдельном потоке, может так будет работать. Либо создай соединение с БД, в том же потоке, где выполняешь запрос.

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

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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