WorkQueue.h
上传用户:dfzycw
上传日期:2010-01-10
资源大小:66k
文件大小:2k
源码类别:

进程与线程

开发平台:

Visual C++

  1. #ifndef WORK_QUEUE_H
  2. #define WORK_QUEUE_H
  3. #include <queue>
  4. class CWorkQueue;
  5. /*------------------------------------------------------------------------
  6. WorkItemBase
  7. this is the basic WorkItem that the Work Queue Use its interface
  8. This class should be inherited and these virtual abstract functions 
  9. implemented.
  10.   DoWork()
  11.   virtual abstract function is the function that is called when the
  12.   work item turn has came to be poped out of the queue and be processed.
  13.   Abort ()
  14.   This function is called, when the Destroy function is called, for each of the WorkItems
  15.   That are left in the queue.
  16.   
  17. ------------------------------------------------------------------------*/
  18. class WorkItemBase
  19. {
  20.    virtual void   DoWork(void* pThreadContext)    = 0;
  21.    virtual void   Abort () = 0;
  22.    friend CWorkQueue;
  23. };
  24. typedef std::queue<WorkItemBase*>           WorkItemQueue,*PWorkItemQueue;
  25. /*------------------------------------------------------------------------
  26. CWorkQueue  
  27.   这是一个工作队列类,也就是线程池,这个类主要是创建线程队列,然后等待,直到
  28.   有工作项目插入进来,它就唤醒相应的线程执行相应工作项目的代码,然后继续进入
  29.   等待状态
  30. ------------------------------------------------------------------------*/
  31. class  CWorkQueue 
  32. {
  33. public:
  34.    virtual ~CWorkQueue(){};
  35.    
  36.    bool Create(const unsigned int nNumberOfThreads, 
  37.                void* *pThreadDataArray             = NULL);
  38.    
  39.    bool InsertWorkItem(WorkItemBase* pWorkItem);
  40.    
  41.    void Destroy();
  42. private:
  43.    
  44.    static unsigned long __stdcall ThreadFunc( void* pParam );
  45.    WorkItemBase* RemoveWorkItem();
  46.    
  47.    
  48.    
  49.    enum{
  50.       ABORT_EVENT_INDEX = 0,
  51.       SEMAPHORE_INDEX,
  52.       NUMBER_OF_SYNC_OBJ,
  53.    };
  54.    PHANDLE m_phThreads;
  55.    unsigned int m_nNumberOfThreads;
  56.    void* m_pThreadDataArray;
  57.    
  58.    HANDLE m_phSincObjectsArray[NUMBER_OF_SYNC_OBJ];
  59.    CRITICAL_SECTION m_CriticalSection;
  60.    PWorkItemQueue           m_pWorkItemQueue;
  61. };
  62. #endif // WORK_QUEUE_H