MsgMap.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #pragma once
  2. #include "CcosLock.h"
  3. #include "LinuxEvent.h"
  4. #include <map>
  5. //#include <algorithm>
  6. using namespace std;
  7. template<typename T,typename Q> class MsgMap
  8. {
  9. CcosLock m_Lock;
  10. std::shared_ptr<LinuxEvent> m_NotifyInMap;
  11. map<T,Q> m_DataMap;
  12. public:
  13. MsgMap(void)
  14. {
  15. m_NotifyInMap = LinuxEvent::CreateEvent(LinuxEvent::MANUAL_RESET,false);
  16. };
  17. ~MsgMap(void)
  18. {
  19. Clear();
  20. };
  21. bool Clear()
  22. {
  23. m_NotifyInMap->ResetEvent();
  24. m_Lock.Thread_Lock();
  25. m_DataMap.clear();
  26. m_Lock.Thread_UnLock();
  27. return true;
  28. };
  29. bool Find(T rKey, Q &rVal)
  30. {
  31. bool ret = false;
  32. m_Lock.Thread_Lock();
  33. //DebugPrint("before deQue size:%d\n",m_DataQueue.size());
  34. if (m_DataMap.size() > 0)
  35. {
  36. typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);// find(m_DataMap.begin(), m_DataMap.end(), rKey);
  37. if (result1 != m_DataMap.end())
  38. {
  39. rVal = m_DataMap[rKey];
  40. ret = true;
  41. }
  42. }
  43. //DebugPrint("after deQue size:%d\n",m_DataQueue.size());
  44. m_Lock.Thread_UnLock();
  45. return ret;
  46. };
  47. bool FindAndClear(T &rKey)
  48. {
  49. bool ret = false;
  50. typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);// find(m_DataMap.begin(), m_DataMap.end(), rKey);
  51. if (result1 != m_DataMap.end())
  52. {
  53. m_DataMap.erase(result1);
  54. ret = true;
  55. }
  56. if (m_DataMap.size() == 0)
  57. {
  58. m_NotifyInMap->ResetEvent();
  59. }
  60. return ret;
  61. };
  62. bool DeMap(T &rKey, Q &rVal)
  63. {
  64. bool ret = false;
  65. m_Lock.Thread_Lock();
  66. //DebugPrint("before deQue size:%d\n",m_DataQueue.size());
  67. if (m_DataMap.size() > 0)
  68. {
  69. typename map<T, Q>::iterator result1 = m_DataMap.find(rKey);//find(m_DataMap.begin(), m_DataMap.end(), rKey);
  70. if (result1 != m_DataMap.end())
  71. {
  72. rVal = m_DataMap[rKey];
  73. m_DataMap.erase(result1);
  74. ret = true;
  75. }
  76. }
  77. //DebugPrint("after deQue size:%d\n",m_DataQueue.size());
  78. if (m_DataMap.size() == 0)
  79. {
  80. m_NotifyInMap->ResetEvent();
  81. }
  82. m_Lock.Thread_UnLock();
  83. return ret;
  84. };
  85. bool InMap(T &rKey,Q &rVal)
  86. {
  87. m_Lock.Thread_Lock();
  88. m_DataMap[rKey] = rVal;
  89. m_Lock.Thread_UnLock();
  90. m_NotifyInMap->SetEvent();
  91. return true;
  92. };
  93. DWORD WaitForInMap(DWORD timeout)
  94. {
  95. DWORD ret = WAIT_TIMEOUT;
  96. m_Lock.Thread_Lock();
  97. if (m_DataMap.size() > 0)
  98. {
  99. ret = WAIT_OBJECT_0;
  100. }
  101. m_Lock.Thread_UnLock();
  102. if(ret == WAIT_TIMEOUT)
  103. {
  104. return m_NotifyInMap->Wait(timeout);
  105. }
  106. return ret;
  107. };
  108. };