我想分離與主線程的Db交互。連接將子類QRunnable
並開始在run()
函數中打開連接,連接管理器將保存QthreadPool
並在需要查詢時啓動該任務。在三層體系結構中實現線程:無法打開數據庫
但問題是它保持報告無法打開數據庫,如果我使用相同的代碼在一個簡單的main()
,它運作良好。所以我不知道?
任何想法表示讚賞:)
這裏是我的實現:
#include <Qt/QtSql>
#include <QRunnable>
class DbConnection : public QRunnable
{
private:
QSqlDatabase db;
bool isConnectToDB;
public:
DbConnection();
QSqlDatabase getDb() const;
void setDb(const QSqlDatabase &value);
bool getIsConnectToDB() const;
void setIsConnectToDB(bool value);
void run();
void openConnToDB();
};
QSqlDatabase DbConnection::getDb() const
{
return db;
}
void DbConnection::setDb(const QSqlDatabase &value)
{
db = value;
}
bool DbConnection::getIsConnectToDB() const
{
return isConnectToDB;
}
void DbConnection::setIsConnectToDB(bool value)
{
isConnectToDB = value;
}
void DbConnection::run()
{
openConnToDB();
qDebug()<< "Open a connection from thread" << QThread::currentThread();
}
void DbConnection::openConnToDB() //=> work well in a simple test program
{
db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("postgres");
db.setPassword("1");
db.setPort(5432);
isConnectToDB = db.open("postgres","1");;
//usleep(100000);
}
DbConnection::DbConnection()
{
}
class DBConnManager
{
private:
DBConnManager();
static DBConnManager *m_Instance;
QThreadPool *threadPool;
QList<DbConnection *> connList;
DbConnection* conn;
public:
static DBConnManager *getInstance();
QList<DbConnection *> getConnList() const;
void setConnList(const QList<DbConnection *> &value);
QSqlDatabase acquireDb();
DbConnection *getConn() const;
void setConn(DbConnection *value);
void closeDb();
};
DBConnManager *DBConnManager::m_Instance = 0;
DBConnManager::DBConnManager()
{
threadPool = QThreadPool::globalInstance();
}
DbConnection *DBConnManager::getConn() const
{
return conn;
}
void DBConnManager::setConn(DbConnection *value)
{
conn = value;
}
void DBConnManager::closeDb()
{
if (conn==NULL) {
qDebug()<< "NULL connection pointer";
return;
}
conn->getDb().close();
}
QList<DbConnection *> DBConnManager::getConnList() const
{
return connList;
}
void DBConnManager::setConnList(const QList<DbConnection *> &value)
{
connList = value;
}
QSqlDatabase DBConnManager::acquireDb()
{
conn = new DbConnection;
connList.append(conn);
threadPool->start(conn);
// QSqlDatabase tmp;
// return tmp;
return conn->getDb();
}
DBConnManager *DBConnManager::getInstance()
{
if (!m_Instance) {
m_Instance = new DBConnManager;
}
return m_Instance;
}
,這是在這一切開始:
QList<arcEntity> arcBL::getAll()
{
QList <arcEntity> listResult;
QSqlDatabase db = DBConnManager::getInstance()->acquireDb();
bool result = m_arcDAL.getAll(&db,listResult);
if (result==false) {
qDebug()<<"Query get all fail";
}
DBConnManager::getInstance()->closeDb();
return listResult;
}
謝謝指出:)非常豐富的:)目前,我實現了一個類似於你的'DBQuery'的'Worker'類子類'QThread'。完成後我會再次反饋:) – Tiana987642 2014-09-07 17:10:59