ThrdPool.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:8k
源码类别:

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : ThrdPool.h
  3. Purpose: Interface for an MFC wrapper class for thread pools
  4. Created: PJN / 15-04-2001
  5. Copyright (c) 2002 - 2005 by PJ Naughter.  (Web: www.naughter.com, Email: pjna@naughter.com)
  6. All rights reserved.
  7. Copyright / Usage Details:
  8. You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
  9. when your product is released in binary form. You are allowed to modify the source code in any way you want 
  10. except you cannot modify the copyright details at the top of each module. If you want to distribute source 
  11. code with your application, then you are only allowed to distribute versions released by the author. This is 
  12. to maintain a single distribution point for the source code. 
  13. */
  14. /////////////////////////////// Defines ///////////////////////////////////////////////////////////
  15. #ifndef __THRDPOOL_H__
  16. #define __THRDPOOL_H__
  17. #ifndef THRDPOOL_EXT_CLASS
  18. #define THRDPOOL_EXT_CLASS
  19. #endif
  20. ////////////////////////////////// Macros / Defines ///////////////////////////////////////////////
  21. const DWORD THREADPOOL_SHUTDOWN_REQUEST = 0;
  22. const DWORD THREADPOOL_USER_DEFINED_REQUEST = 1;
  23. //////////////////////////////////// Classes //////////////////////////////////////////////////////
  24. //Forward declaration
  25. class CThreadPoolServer;
  26. //Represents an instances of a request as stored on the thread pools queue
  27. class THRDPOOL_EXT_CLASS CThreadPoolRequest
  28. {
  29. public:
  30. //Constructors / Destructors
  31.   CThreadPoolRequest();
  32.   CThreadPoolRequest(const CThreadPoolRequest& request);
  33.   virtual ~CThreadPoolRequest();
  34. //methods
  35.   CThreadPoolRequest& operator=(const CThreadPoolRequest& request);
  36. //Member variables
  37.   BOOL  m_bDirectedRequest;        //If this to be a directed request i.e. targetted at a specific thread
  38. #if _MSC_VER >= 1300
  39.   INT_PTR m_nDirectedRequestIndex; //The index of the associated thread if this is a directed request
  40. #else  
  41.   int     m_nDirectedRequestIndex; //The index of the associated thread if this is a directed request
  42. #endif  
  43.   DWORD m_dwID;                    //Any item data you want to associate with the request
  44.   void* m_pData;                   //Any opaque data you want to associate with the requested
  45. };
  46. //Class which you derive from to implement your own thread pool behaviour
  47. class THRDPOOL_EXT_CLASS CThreadPoolClient : public CObject
  48. {
  49. public:
  50. //Constructors / Destructors
  51.   CThreadPoolClient();
  52.   virtual ~CThreadPoolClient(); 
  53. //Methods
  54.   virtual void SetRequestToStop();                     //Called by the manager when CThreadPoolServer::Stop is called. You can use this or 
  55.                                                        //the member variable m_bRequestToStop to effect a premature exit from it, rather than
  56.                                                        //waiting for a stop request to arrive via the thread pool queue
  57. protected:
  58. //Virtual methods
  59.   virtual BOOL InitInstance();                         //Similiar to the MFC function of the same name
  60.   virtual int  ExitInstance();                         //Similiar to the MFC function of the same name
  61.   virtual BOOL Run(const CThreadPoolRequest& request); //The function which is called to handle client requests
  62.   DECLARE_DYNCREATE(CThreadPoolClient)
  63.   
  64. //Member variables
  65.   CWinThread*        m_pWorkerThread;          //The actual worker thread object
  66.   CThreadPoolServer* m_pPoolServer;            //Reference to this objects manager 
  67.   volatile BOOL      m_bRequestToStop;         //Set to TRUE by the manager when CThreadPoolServer::Stop is called. You can use this inside of
  68.                                                //your derived Run method to effect a premature exit from it, rather than waiting for a Stop
  69.                                                //request to arrive via the thread pool queueu
  70.   CEvent             m_evtInitCompleted;       //Signalled when InitInstance has completed, Use by CThreadPoolServer::WaitForThreadsInitInstance
  71.   BOOL               m_bInitOK;                //Has InitInstance completed successfully
  72.   int                m_nStartupThreadPriority; //The thread priority which this thread started with
  73.   UINT               m_nStackSize;             //The size of the stack this thread started with
  74.   int                m_nThreadIndex;           //The thread index of this thread in the thread pool
  75. //The worker thread
  76.   static UINT _Run(LPVOID pParam);
  77. };
  78. //Base class which implements a Queue for the thread pool
  79. class THRDPOOL_EXT_CLASS CThreadPoolQueue : public CObject
  80. {
  81. public:
  82. //Constructors / Destructors
  83.   CThreadPoolQueue();
  84.   virtual ~CThreadPoolQueue();  
  85. //Methods
  86.   virtual BOOL Create(DWORD /*dwMaxQSize*/) { return FALSE; };
  87.   virtual BOOL PostRequest(const CThreadPoolRequest& /*request*/, DWORD /*dwMilliseconds*/ = INFINITE) { return FALSE; };
  88.   virtual BOOL PostRequestWithoutLimitCheck(const CThreadPoolRequest& /*request*/) { return FALSE; };
  89.   virtual BOOL GetRequest(CThreadPoolRequest& /*request*/, int /*nThreadIndexForDirectedRequest*/, DWORD /*dwMilliseconds*/ = INFINITE) { return FALSE; };
  90.   virtual BOOL IsCreated() const { return FALSE; };
  91.   virtual BOOL SupportsDirectedRequests() const { return FALSE; };
  92. protected:
  93.   DECLARE_DYNCREATE(CThreadPoolQueue);
  94. };
  95. //The class which manages the thread pool
  96. class THRDPOOL_EXT_CLASS CThreadPoolServer
  97. {
  98. public:
  99. //Constructors / Destructors
  100.   CThreadPoolServer();
  101.   virtual ~CThreadPoolServer();
  102. //Methods  
  103.   virtual BOOL               Start(CRuntimeClass* pRuntimeClient, CRuntimeClass* pRuntimeQueue, int nPoolSize, int nQueueSize, BOOL bSuspended = FALSE, 
  104.                                    int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0); //Starts up the thread pool
  105.   virtual void               Stop();                                                                                                                                    //Closes down the thread pool
  106.   virtual CThreadPoolClient* GetAtClient(int nIndex);
  107.   virtual BOOL               WaitForThreadsInitInstance();
  108.   BOOL                       SetMaxThreadClientLifetime(BOOL bEnableThreadLifetime, DWORD dwMinutes);
  109.   BOOL                       GetEnabledThreadClientLifetime() const { return m_bMaxLifetime; };
  110.   DWORD                      GetMaxThreadClientLifetime() const { return m_dwMaxLifetime; };
  111.   int                        GetPoolSize() const { return (int) m_Threads.GetSize(); };
  112.   CThreadPoolQueue*          GetQueue() const { return m_pQueue; };
  113. protected:
  114. //typedefs
  115.   typedef HANDLE (*lpfnCreateWaitableTimer)(LPSECURITY_ATTRIBUTES, BOOL, LPCTSTR);
  116.   typedef BOOL (*lpfnSetWaitableTimer)(HANDLE, const LARGE_INTEGER*, LONG, PTIMERAPCROUTINE, LPVOID, BOOL);
  117. //Methods
  118.   static UINT _Monitor(LPVOID pParam);
  119.   virtual UINT Monitor();
  120.   virtual BOOL RecycleThread();
  121. //Member variables
  122.   CArray<CThreadPoolClient*, CThreadPoolClient*&> m_Threads; //The actual thread pool
  123.   CThreadPoolQueue* m_pQueue;                                //The queue class instance
  124.   CCriticalSection m_csThreads;                              //Serializes access to "m_Threads"
  125.   BOOL m_bMaxLifetime;                                       //Should threads be limited to a certain lifetime
  126.   DWORD m_dwMaxLifetime;                                     //Lifetime of threads if m_bMaxLifetime is TRUE
  127.   CWinThread* m_pLifetimeMonitorThread;                      //The thread which recycles the client threads
  128.   CEvent m_evtRequestLifetimeThread;                         //Event which gets set to request the lifetime monitoring thread to exit
  129.   int    m_nLifetimeThreadIndex;                             //The index of the next thread to be recycled
  130.   lpfnCreateWaitableTimer m_lpfnCreateWaitableTimer;         //Waitable timer function pointers
  131.   lpfnSetWaitableTimer m_lpfnSetWaitableTimer;               //Waitable timer function pointers
  132. };
  133. #endif //__THRDPOOL_H__