Russian Qt Forum

Qt => Model-View (MV) => Тема начата: kalif от Февраль 12, 2011, 13:46



Название: Модель в отдельном потоке.
Отправлено: kalif от Февраль 12, 2011, 13:46
Всем привет.
У меня имеется QSqlQueryModel которая отображается в QTableView.
Подскажите возможно ли выкинуть модель в отдельный поток?


Название: Re: Модель в отдельном потоке.
Отправлено: trot от Февраль 12, 2011, 16:56
Возможно


Название: Re: Модель в отдельном потоке.
Отправлено: CL0NE от Февраль 12, 2011, 19:33
Как и любой другой qobject ;)


Название: Re: Модель в отдельном потоке.
Отправлено: kalif от Февраль 12, 2011, 21:17
А можно увидеть это в коде? А то я пытаюсь, но что-то ничего не выходит. :(


Название: Re: Модель в отдельном потоке.
Отправлено: CL0NE от Февраль 13, 2011, 22:39
http://blog.exys.org/entries/2010/QThread_affinity.html


Название: Re: Модель в отдельном потоке.
Отправлено: kalif от Февраль 15, 2011, 09:27
Так как написано в примере не работает.
Падает при запуске программы. :(


Название: Re: Модель в отдельном потоке.
Отправлено: Странник от Февраль 15, 2011, 11:25
в теории-то можно, конечно. на практике - тот еще геморрой из материала заказчика. особенно если учесть, что sql-запросы должны выполняться в том же потоке, в котором создано соединение с базой. межпотоковое взаимодействие модели и представления тоже может ой как удивить.


Название: Re: Модель в отдельном потоке.
Отправлено: kalif от Февраль 15, 2011, 20:24
Получилось таки добиться желаемого :)
Код
C++ (Qt)
class ModelUpdateThread : public QThread
{
public:
   ModelUpdateThread();
 
private:
   QString query;
 
protected:
   void run();
 
public:
   void setQuery(QString query);
};
 
ModelUpdateThread::ModelUpdateThread()
{
   model = new QSqlQueryModel();
   model->moveToThread(this);
}
 
void ModelUpdateThread::run() {
 
   QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL","update");
   db.setHostName("localhost");
   db.setDatabaseName("test");
   db.setPort(3306);
   db.setUserName("user");
   db.setPassword("1234");
   db.open();
   model->setQuery(query,db);
   db.close();
 
}
 
void ModelUpdateThread::setQuery(QString query) {
 
   this->query = query;
   this->start();
}
 

Эту модель из класса и вставляем потом в вид.

Еще можно тут (http://www.linuxjournal.com/article/9602?page=0,0) почитать про асинхронный доступ к бд.