diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.cpp b/ZoomPipeline_FuncSvr/database/databaseresource.cpp index 4989e53fc7e12bf5677070752266d8e3b195f769..279660d9b2cc2aa52ceefecfd7de01c373defa66 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.cpp +++ b/ZoomPipeline_FuncSvr/database/databaseresource.cpp @@ -4,8 +4,9 @@ #include namespace ZPDatabase{ DatabaseResource::DatabaseResource(QObject *parent) : - QObject(parent) + QThread(parent) { + bTerm = false; } //!Get an database connection belong to current thread. //!if database does not exist, it will be added using dbtype @@ -22,7 +23,12 @@ QSqlDatabase DatabaseResource::databse(const QString & strDBName) } void DatabaseResource::remove_connections() { - QMap sets = currentDatabaseConnections(); + QMap sets; + { + QMutexLocker locker(&m_mutex_reg); + sets = currentDatabaseConnections(); + } + foreach (QString name, sets.keys()) this->remove_connection(name); } @@ -69,6 +75,7 @@ bool DatabaseResource::addConnection( para.dbName = dbName; para.User = User; para.Pass = Pass; + para.status = true; para.ExtraOptions = ExtraOptions; if (true==QSqlDatabase::contains(connName)) @@ -107,7 +114,7 @@ bool DatabaseResource::confirmConnection (const QString & connName) emit evt_Message(msg); return false; } - const tagConnectionPara & para = m_dbNames[connName]; + tagConnectionPara & para = m_dbNames[connName]; if (true==QSqlDatabase::contains(connName) ) { QSqlDatabase db = QSqlDatabase::database(connName); @@ -123,11 +130,17 @@ bool DatabaseResource::confirmConnection (const QString & connName) db.setPassword(para.Pass); db.setConnectOptions(para.ExtraOptions); if (db.open()==true) + { + para.status = true; + para.lastError = ""; return true; + } QSqlDatabase::removeDatabase(connName); msg = tr(" Connection ")+connName+ tr(" Can't be opened. MSG="); msg += db.lastError().text(); emit evt_Message(msg); + para.status = false; + para.lastError = db.lastError().text(); return false; } @@ -139,11 +152,40 @@ bool DatabaseResource::confirmConnection (const QString & connName) db.setPassword(para.Pass); db.setConnectOptions(para.ExtraOptions); if (db.open()==true) + { + para.status = true; + para.lastError = ""; return true; + } QString msg = tr(" Connection ")+connName+ tr(" Can't be opened. MSG="); msg += db.lastError().text(); emit evt_Message(msg); QSqlDatabase::removeDatabase(connName); + para.status = false; + para.lastError = db.lastError().text(); return false; } + +void DatabaseResource::run() +{ + while(bTerm==false) + { + QMap sets; + { + QMutexLocker locker(&m_mutex_reg); + sets = currentDatabaseConnections(); + } + + foreach (QString name, sets.keys()) + { + confirmConnection(name) ; + if (bTerm==true) + break; + } + if (bTerm==false) + QThread::currentThread()->msleep(30000); + } + +} + }; diff --git a/ZoomPipeline_FuncSvr/database/databaseresource.h b/ZoomPipeline_FuncSvr/database/databaseresource.h index d398f22f8e370e87fbacc9b8b7b1b18af6f8e301..f610bb2567e6cfdc6947dcb21506ccd0fc05132a 100644 --- a/ZoomPipeline_FuncSvr/database/databaseresource.h +++ b/ZoomPipeline_FuncSvr/database/databaseresource.h @@ -6,11 +6,12 @@ #include #include #include +#include //!this class provide an database reource, //!In different thread, workers can get existing db connections //! immediately without re-creation operations. namespace ZPDatabase{ -class DatabaseResource : public QObject +class DatabaseResource : public QThread { Q_OBJECT public: @@ -23,8 +24,8 @@ public: QString User; QString Pass; QString ExtraOptions; - - + bool status; + QString lastError; } ; public: @@ -49,9 +50,14 @@ public: void remove_connections(); bool confirmConnection (const QString & connName); - const QMap & currentDatabaseConnections(){return m_dbNames;} + QMap currentDatabaseConnections(){return m_dbNames;} + + void run(); + + void TerminateMe(){bTerm = true;} protected: + bool bTerm; QMutex m_mutex_reg; QMap m_dbNames; signals: diff --git a/ZoomPipeline_FuncSvr/zpmainframe.cpp b/ZoomPipeline_FuncSvr/zpmainframe.cpp index 3f3b32baba48e181138b4fd81354bb07cbdf58a1..081b5a5ed90417f9a240f79c86123a82fd988a80 100644 --- a/ZoomPipeline_FuncSvr/zpmainframe.cpp +++ b/ZoomPipeline_FuncSvr/zpmainframe.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace ZPNetwork; using namespace ZPTaskEngine; ZPMainFrame::ZPMainFrame(QWidget *parent) : @@ -27,6 +28,7 @@ ZPMainFrame::ZPMainFrame(QWidget *parent) : //Create databases m_pDatabases = new ZPDatabase::DatabaseResource(this); connect (m_pDatabases,&ZPDatabase::DatabaseResource::evt_Message,this,&ZPMainFrame::on_evt_Message); + m_pDatabases->start(); m_nTimerId = startTimer(500); @@ -39,10 +41,13 @@ ZPMainFrame::~ZPMainFrame() m_netEngine->RemoveAllAddresses(); m_netEngine->KickAllClients(); m_netEngine->DeactiveImmediately(); + //term the confirm check + m_pDatabases->TerminateMe(); m_pDatabases->remove_connections(); m_taskEngine->removeThreads(-1); - while (m_netEngine->CanExit()==false || m_taskEngine->canClose()==false) + while (m_netEngine->CanExit()==false || m_taskEngine->canClose()==false + || m_pDatabases->isRunning()==true) { QCoreApplication::processEvents(); QThread::currentThread()->msleep(200); @@ -141,6 +146,20 @@ void ZPMainFrame::timerEvent(QTimerEvent * e) str_msg += tr("Current Task Threads: %1\n").arg(m_taskEngine->threadsCount()); str_msg += tr("Current Task Payload: %1\n").arg(m_taskEngine->payload()); str_msg += tr("Current Task Idle Threads: %1\n").arg(m_taskEngine->idleThreads()); + + QMap map_conns + = m_pDatabases->currentDatabaseConnections(); + str_msg += tr("Database Connections: %1\n").arg(map_conns.size()); + foreach (QString name,map_conns.keys() ) + { + ZPDatabase::DatabaseResource::tagConnectionPara & para = map_conns[name]; + str_msg += tr("\t%1 status = %2").arg(name).arg(para.status); + if (para.status==false) + str_msg += ", Msg=" + para.lastError; + str_msg += "\n"; + } + + ui->plainTextEdit_status_net->setPlainText(str_msg); } }