ResList.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #pragma once
  2. #include <list>
  3. using namespace std;
  4. #ifdef DRIVERAPI_EXPORTS
  5. #define DRIVERAPI_API __declspec(dllexport)
  6. #else
  7. #define DRIVERAPI_API __declspec(dllimport)
  8. #endif
  9. template <class T>
  10. class ResList
  11. {
  12. protected:
  13. HANDLE m_Lock;
  14. HANDLE m_Notify;
  15. PVOID m_Queue;
  16. public:
  17. ResList::ResList(void)
  18. {
  19. m_Notify = CreateEvent(0,0,0,0);
  20. m_Lock = CreateMutex(0,0,0);
  21. list<T> *pQue = new list<T>;
  22. if(pQue)
  23. {
  24. m_Queue = (PVOID)pQue;
  25. }
  26. else
  27. {
  28. m_Queue = NULL;
  29. }
  30. };
  31. ResList::~ResList(void)
  32. {
  33. if(m_Queue)
  34. {
  35. list<T> *pQue = (list<T>*)m_Queue;
  36. delete pQue;
  37. m_Queue = NULL;
  38. }
  39. CloseHandle(m_Lock);
  40. };
  41. void Clear()
  42. {
  43. WaitForSingleObject(m_Lock,INFINITE);
  44. ((list<T>*)m_Queue)->clear();
  45. ReleaseMutex(m_Lock);
  46. }
  47. DWORD Size()
  48. {
  49. DWORD ret = 0;
  50. WaitForSingleObject(m_Lock,INFINITE);
  51. ret = ((list<T>*)m_Queue)->size();
  52. ReleaseMutex(m_Lock);
  53. return ret;
  54. };
  55. void PushQue(T &obj)
  56. {
  57. WaitForSingleObject(m_Lock,INFINITE);
  58. ((list<T>*)m_Queue)->push_back(obj);
  59. ReleaseMutex(m_Lock);
  60. SetEvent(m_Notify);
  61. };
  62. bool PopQue(T &obj)
  63. {
  64. bool ret = false;
  65. WaitForSingleObject(m_Lock,INFINITE);
  66. if(((list<T>*)m_Queue)->size() > 0)
  67. {
  68. obj = ((list<T>*)m_Queue)->front();
  69. ((list<T>*)m_Queue)->pop_front();
  70. ret= true;
  71. }
  72. ReleaseMutex(m_Lock);
  73. return ret;
  74. };
  75. bool WaitForInQue(T &obj,DWORD timeout)
  76. {
  77. if(PopQue(obj))
  78. {
  79. return true;
  80. }
  81. if(WaitForSingleObject(m_Notify,timeout) == WAIT_OBJECT_0)
  82. {
  83. return PopQue(obj);
  84. }
  85. return false;
  86. }
  87. };