/* * DBConnectPool.h * * Created on: 2013-6-17 * Author: lihao */ #ifndef DBCONNECTPOOL_H_ #define DBCONNECTPOOL_H_ #include "ThreadKit/ThreadKit.h" #include "db_com/DBAccess.h" #include #include #include using namespace std; struct TDBConnInfo { char user_name[16]; char passwd[16]; char db_server_name[16]; }; /* * 工作任务类 */ class ThreadTask : public THREADKIT::RefCount { public: ThreadTask() { m_pdbaccess = NULL; m_requestBuffer = NULL; m_requestlen = 0; m_responseBuffer = NULL; m_responselen = NULL; m_p_db_info= NULL; } virtual ~ThreadTask(){} virtual void SetCurDBConnection(CDbAccess* pDbAccess, TDBConnInfo* last_db_info, unsigned int pid){} // { // m_pdbaccess = pDbAccess; // m_pid = pid; // } virtual void ProcessOneTask(){} virtual void Wait(){} protected: virtual void Signal(){} protected: CDbAccess *m_pdbaccess; char *m_requestBuffer; int m_requestlen; char **m_responseBuffer; int *m_responselen; unsigned int m_pid; bool m_can_start, m_is_stopped; TDBConnInfo* m_p_db_info; string err_msg; }; typedef THREADKIT::Handle ThreadTaskHandle; class DBConnectThread; // 单个线程类 class DBConnectPoolImpl; // 线程池实体类 // class DBConnectPool { public: /* * 创建一个包含threadPoolNum个线程的线程池 */ DBConnectPool(unsigned int threadPoolNum); virtual ~DBConnectPool(); //int initAllConnect(const char* user_name, const char* passwd, const char* db_service_name, string &err_msg); // 启动所有线程工作 int start(string &err_msg); //获取线程池中当前线程个数 unsigned int getThreadCount(); //停止所有线程 void stop(); //等待所有工作队列任务都完成 bool wait(); //msec时间内,等待所有工作队列任务都完成 //如果所有任务都完成,则返回true bool waitTimeout(unsigned long msec); //在线程池中加入一个工作任务 void postWork(ThreadTaskHandle task); //处理线程中的异常 virtual void uncaughtException(THREADKIT::Thread* t); virtual void uncaughtException(THREADKIT::Thread* t, const THREADKIT::Exception &e); private: friend class DBConnectThread; int m_can_start; // ThreadTaskHandle waitForTask(); //获取队列头部任务 void finishThisWork(); DBConnectPoolImpl* m_pool_impl; DECLARE_NO_ASSIGN_CLASS(DBConnectPool) }; #endif /* DBCONNECTPOOL_H_ */