AsynFunctionT.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. 异步 任务 处理
  3. */
  4. #include <process.h>
  5. #include <functional>
  6. #include <list>
  7. template<class ParamType=LPVOID> // char* string void*
  8. class AsynTaskHandle
  9. {
  10. typedef struct tagTask
  11. {
  12. std::function<void(ParamType)> fun;
  13. ParamType lpParam;
  14. }AsynTask, *PAsynTask;
  15. protected:
  16. volatile bool m_bQuit;
  17. HANDLE* m_phThread;
  18. unsigned int m_nThreadCount;
  19. //UINT m_dwThreadId;
  20. //HANDLE m_hListEvent;
  21. HANDLE m_hSemaphore; //信号量 句柄
  22. CRITICAL_SECTION m_csLock; //维持队列同步
  23. std::list<PAsynTask> m_TaskList;
  24. public:
  25. AsynTaskHandle(unsigned int nThreadCount=4)
  26. : m_bQuit(false)
  27. , m_nThreadCount(nThreadCount)
  28. {
  29. InitializeCriticalSection(&m_csLock);
  30. m_hSemaphore = CreateSemaphore(NULL, 0, 100, NULL);
  31. //m_hListEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
  32. assert(m_nThreadCount);
  33. m_phThread = new HANDLE[m_nThreadCount];
  34. for (unsigned int i=0; i<m_nThreadCount; ++i)
  35. {
  36. m_phThread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, this, NULL, NULL);
  37. }
  38. }
  39. virtual ~AsynTaskHandle()
  40. {
  41. if(NULL != m_hSemaphore)
  42. {
  43. CloseHandle(m_hSemaphore);
  44. m_hSemaphore = NULL;
  45. }
  46. if(m_TaskList.size() > 0) // 要退出了 且 任务没执行完 要清理缓存
  47. {
  48. for each (auto var in m_TaskList)
  49. {
  50. delete var;
  51. }
  52. }
  53. for (unsigned int i=0; i<m_nThreadCount; ++i)
  54. {
  55. CloseHandle(m_phThread[i]);
  56. }
  57. if (m_phThread) {
  58. delete[] m_phThread;
  59. m_phThread = NULL;
  60. DeleteCriticalSection(&m_csLock);
  61. }
  62. }
  63. public:
  64. template<class Fun, class This>
  65. void AddTask(Fun fun, This t, ParamType lpParam)
  66. {
  67. auto task = new AsynTask;
  68. task->fun = std::bind(fun, t, std::placeholders::_1);
  69. task->lpParam = lpParam;
  70. EnterCriticalSection(&m_csLock);
  71. m_TaskList.push_back(task); //交换数据
  72. LeaveCriticalSection(&m_csLock);
  73. //SetEvent(m_hListEvent);
  74. ReleaseSemaphore(m_hSemaphore, 1, NULL);
  75. }
  76. void AddTask(std::function<void(ParamType)> fun, ParamType lpParam)
  77. {
  78. auto task = new AsynTask;
  79. task->fun = fun;
  80. task->lpParam = lpParam;
  81. EnterCriticalSection(&m_csLock);
  82. m_TaskList.push_back(task); //交换数据
  83. LeaveCriticalSection(&m_csLock);
  84. //SetEvent(m_hListEvent);
  85. ReleaseSemaphore(m_hSemaphore, 1, NULL);
  86. }
  87. void Close(DWORD dwWait=1000)
  88. {
  89. m_bQuit = true;
  90. //SetEvent(m_hListEvent);
  91. ReleaseSemaphore(m_hSemaphore, m_nThreadCount, NULL);
  92. //
  93. for (unsigned int i = 0; i < m_nThreadCount; ++i)
  94. {
  95. WaitForSingleObject(m_phThread[i], dwWait);
  96. }
  97. /*for (unsigned int i = 0; i < m_nThreadCount; ++i)
  98. {
  99. WaitForSingleObject(m_hThread[i], dwWait);
  100. }*/
  101. }
  102. protected:
  103. unsigned int Handle()
  104. {
  105. while (!m_bQuit)
  106. {
  107. ::WaitForSingleObject(m_hSemaphore, INFINITE);
  108. if(m_bQuit)
  109. break;
  110. /*OutputDebugString(_T("AsyncFun"));*/
  111. while (!m_bQuit)
  112. {
  113. PAsynTask pTask = NULL;
  114. EnterCriticalSection(&m_csLock);
  115. if(m_TaskList.size() > 0)
  116. {
  117. pTask = m_TaskList.front();
  118. m_TaskList.pop_front();
  119. }
  120. LeaveCriticalSection(&m_csLock);
  121. if(NULL == pTask)
  122. break;
  123. pTask->fun(pTask->lpParam);
  124. delete pTask;
  125. }
  126. }
  127. return 0;
  128. }
  129. private:
  130. //静态 线程 函数
  131. static unsigned int __stdcall ThreadFun(void* lp)
  132. {
  133. AsynTaskHandle* pThis = (AsynTaskHandle*)lp;
  134. if(NULL == pThis )
  135. return 0;
  136. return pThis->Handle();
  137. }
  138. };