WorkThreadPool.cpp
上传用户:swkcbjrc
上传日期:2016-04-02
资源大小:45277k
文件大小:4k
源码类别:

游戏

开发平台:

Visual C++

  1. // WorkThreadPool.cpp: implementation of the CWorkThreadPool class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Thread.h"
  6. #include "threadpoolmodel.h"
  7. #include "WorkThreadPool.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. extern CWorkThreadPool *g_pPool;
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CWorkThreadPool::CWorkThreadPool() :
  18. m_exit(false,true),m_signal(false,true)
  19. {
  20. pf = NULL;
  21. m_threadNum = 3;
  22. }
  23. CWorkThreadPool::~CWorkThreadPool()
  24. {
  25. }
  26. int CWorkThreadPool::Run()
  27. {
  28. BOOL bResult=TRUE;
  29. SetCurAllThreadCount(3);
  30. SetMaxThreadCount(5);
  31. for(int i=0;i<m_threadNum;i++)
  32. {
  33. HANDLE hNewThread=NULL;
  34. DWORD dwThreadId=0;
  35. if(CreateNewThread(WORK,this,hNewThread,dwThreadId)==TRUE)
  36. {
  37. TRACE("Work ThreadId=%dn",dwThreadId);
  38. }
  39. else
  40. bResult=FALSE;
  41. //线程池满了
  42. if(TPGetLastError()==ERROR_THREADPOOL_FULL)
  43. return (bResult);
  44. }
  45. return 0;
  46. }
  47. //添加任务
  48. void CWorkThreadPool::RegisterWorkItem(LPVOID item)
  49. {
  50. m_workItems.Add(item);
  51. m_signal.SetEvent();
  52. }
  53. LPVOID CWorkThreadPool::GetNextItem()
  54. {
  55. LPVOID ret = NULL;
  56. m_lock.Lock();
  57. if(m_workItems.GetSize())
  58. ret = m_workItems[0];
  59. m_lock.Unlock();
  60. return ret;
  61. }
  62. void CWorkThreadPool::SetPF(lpCallBack1 *f)
  63. {
  64. pf = f;
  65. }
  66. UINT CWorkThreadPool::Work()
  67. {
  68. //如果全局线程池指针为空,则直接退出本线程
  69.     if(g_pPool==NULL)
  70.     {  
  71. //同时从当前存在线程数中减少一个,设置ERROR_GLOBPOOL_NULL
  72. //全局线程错误
  73.         g_pPool->DecrementCurAllThreadCount( );
  74.         return ERROR_GLOBPOOL_NULL;
  75.     }
  76.     TRACE("Work  Thread Startn");
  77.     //取得当前线程ID
  78.     DWORD dwThreadId=GetCurrentThreadId( );
  79.     DWORD dwIndex=0;
  80.     int nTemp=2;
  81.     //声明一个事件数组用于等待事件
  82.     LPHANDLE pEvent=new HANDLE[nTemp];
  83.     pEvent[0]=g_pPool->GetWorkEvent(); //获取工作事件标志
  84. pEvent[1]=m_exit;
  85.     while(TRUE)
  86.     {
  87.         //等待多事件响应,等待工作事件,死亡事件,全局死亡事件
  88.         //如果有一个事件被置为信号态,则继续运行,否则保持等待
  89.         dwIndex=WaitForMultipleObjects(2,pEvent,FALSE,INFINITE);
  90.         //如果等待返回结果为错误,继续运行
  91.         if(dwIndex==WSA_WAIT_FAILED)
  92.         {
  93.             Sleep(300);
  94.             continue;
  95.         }
  96.         g_pPool->IncrementCurWorkThreadCount( );
  97.         DWORD dwTemp=0;
  98.         dwTemp=dwIndex-WSA_WAIT_EVENT_0;
  99.         switch(dwTemp)
  100.         {
  101. //dwTemp返回值为1表示线程要结束
  102.         case 1://均为死亡
  103.             g_pPool->DecrementCurWorkThreadCount( );
  104.             goto CLEAR;
  105. break;
  106. case 0:
  107. break;
  108.         }
  109.         if(dwTemp!=0)
  110.         {
  111.             g_pPool->DecrementCurWorkThreadCount( );
  112.             continue;
  113.         }
  114.         //线程开始工作
  115.         //取得工作内容
  116. LPVOID pItem = GetNextItem();
  117. if(pItem)
  118. {
  119. RemoveWorkItem(pItem);
  120. pf(pItem);
  121. }else
  122. {
  123. m_signal.ResetEvent();
  124. }
  125.     }
  126. CLEAR:
  127.     if(pEvent!=NULL)
  128.     {
  129.         delete []pEvent;
  130.         pEvent=NULL;
  131.     }
  132.     g_pPool->DecrementCurAllThreadCount( );
  133.     return SUCCESS_THREAD_RETURN;
  134. }
  135. UINT CWorkThreadPool::WORK(LPVOID lp)
  136. {
  137. CWorkThreadPool* pWork = (CWorkThreadPool*)lp;
  138. ASSERT(pWork);
  139. pWork->Work();
  140. return 0;
  141. }
  142. void CWorkThreadPool::Stop()
  143. {
  144. m_signal.ResetEvent();
  145. m_exit.SetEvent();
  146. }
  147. //删除工作队列
  148. void CWorkThreadPool::RemoveWorkItem(LPVOID _pItem)
  149. {
  150. LPVOID pItem = NULL;
  151. m_lock.Lock();
  152. for(int i=0;i<m_workItems.GetSize();i++)
  153. {
  154. pItem = (LPVOID)m_workItems[i];
  155. if(_pItem == pItem)
  156. {
  157. m_workItems.RemoveAt(i);
  158. break;
  159. }
  160. }
  161. m_lock.Unlock();
  162. }
  163. void CWorkThreadPool::SetThreadNum(int num)
  164. {
  165. Stop();
  166. ASSERT(num > 0);
  167. m_threadNum = num;
  168. }