crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QSqlDatabase в отдельном потоке, QSqlDatabase в отдельном потоке которому передаются запросы на выполн.
Гость_Sterr_*
сообщение 12.4.2009, 12:51
Сообщение #1





Гости








    


Есть gui приложение работающее с базой. Пытаюсь сделать так, чтобы вся работа с базой была выделена в отдельном потоке. После того как поток запущен ему будет передаваться через сигнал-слот указатель на класс Command, который наследуется остальными классами инкапсулирующими специфику команды. Набросал макет:

CODE
class Database : public QThread
{
private:
    QSqlDatabase *db;

public:
    Database();
    ~Database();
    
    void run();
    void initDatabase(QString user, QString pass);

public slots:
    void sqlExec(Command *);
    
};


CODE
Database::Database()
{
    
}

void Database::run()
{
    db =new QSqlDatabase::addDatabase("QPSQL");
    db->setHostName("192.168.1.2");
    db->setDatabaseName("dreamservice");
    db->setUserName("me");
    db->setPassword("123456");
    if(!db->open())
    {
        qDebug() << "Error opening bd";
    }
    this->exec();
}
void Database::sqlExec(Command *command)
{
    if(!command->start(db))
    {

    }
}

Database::~Database()
{

}




CODE
class Command : public QObject
{
    Q_OBJECT

public:
    Command();
    ~Command();

    virtual bool startCommand(QSqlDatabase *db);
};

class CommandRequestList : public Command
{
    Q_OBJECT

private:
    QSqlQuery *sqlQuery;

public:
    CommandRequestList();
    ~CommandRequestList();

    void setAttributes(int id);
    bool startCommand(QSqlDatabase *db);
};
CommandRequestList::CommandRequestList()
{

}
CommandRequestList::~CommandRequestList()
{

}

bool CommandRequestList::startCommand(QSqlDatabase *db)
{
    if (db != 0)
    {
        sqlQuery = new QSqlQuery(*db);
    
        QString query = "SELECT request.id_request, cl.company_name, agr.arg_service, request.status, request.tdate_create FROM repair_request request, agreement agr, client cl WHERE (request.id_agreement = agr.id_agr) AND (agr.id_client = cl.id_client)";
        if (!sqlQuery->exec(query))
        {
            QSqlError qwe = sqlQuery->lastError();
        }
        delete sqlQuery;
    }
    return true;
}



Вопросов 2:
1) db =new QSqlDatabase::addDatabase("QPSQL"); не работает =(( Я так понимаю что надо или разименование, или создавать объект? Но ведь для того чтобы он выполнялся в отдельном потоке он должен создаваться в секции run ??
2) Реально ли реализовать то что здесь описанно, в смысле.. правильном ли путём иду? Тоесть ещё раз если в кратце:
два потока - главный gui и поток работы с бд. Например при щелчке по форме с поиском вызывается слот который задаёт в соответствующий класс наследованный от Command нужные значения и высылает сигнал с указателем на этот класс. Этот сигнал соединяется со слотом из потока по работе бд sqlExex, в котором потом вызывается Command.startCommand(QSqlDatabase *db) внутри которого создаётся QSqlQuery и идёт вся работа запроса с базой.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Sterr   QSqlDatabase в отдельном потоке   12.4.2009, 12:51
- - Litkevich Yuriy   Цитата(Гость_Sterr_* @ 12.4.2009, 16:51) ...   12.4.2009, 13:05
|- - Sterr   Цитатаdb = new QSqlDatabase(); db->addDatabase(...   12.4.2009, 13:08
- - Sterr   Фразу "Соединение может использоваться только...   12.4.2009, 13:12
- - Litkevich Yuriy   QSqlDatabase::addDatabase("QPSQL"); не в...   12.4.2009, 13:21
|- - Sterr   Если правильно вас понял то в run() создаю соедине...   12.4.2009, 13:36
- - Litkevich Yuriy   Цитата(Гость_Sterr_* @ 12.4.2009, 17:36) ...   12.4.2009, 14:25
|- - defnull   Добрый день. Столкнулся с такой проблемой.. Есть п...   18.4.2009, 21:12
- - Litkevich Yuriy   Цитата(defnull @ 19.4.2009, 1:12) Есть по...   18.4.2009, 21:27
|- - defnull   Цитата(Litkevich Yuriy @ 18.4.2009, 22:27...   18.4.2009, 21:38
- - Litkevich Yuriy   defnull, я к тому, что может быть лучше утяжелить ...   18.4.2009, 21:43
- - padla   Небольшой вопрос. А что произойдет если во время р...   21.4.2009, 17:52
|- - SABROG   Цитата(padla @ 21.4.2009, 18:52) Небольшо...   21.4.2009, 21:59
- - defnull   Цитатаdefnull, я к тому, что может быть лучше утяж...   21.4.2009, 23:55
- - padla   То-есть мне придется ручками опять устанавливать с...   22.4.2009, 17:02


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 4:28