templetgks.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //////////////////////////////////////////////////////////////////////////
  2. // 线程安全的queue
  3. #ifndef OCC_SHARE_DLL_TEMPLET_HEADER_FILE
  4. #define OCC_SHARE_DLL_TEMPLET_HEADER_FILE
  5. #include <queue>
  6. #include <string>
  7. #include <mutex>
  8. using namespace std;
  9. template <class T>
  10. class GksQueue
  11. {
  12. public:
  13. std::recursive_mutex m_MutexCS;
  14. std::string quename;
  15. int m_nCurCount;
  16. public:
  17. GksQueue()
  18. {
  19. init();
  20. }
  21. ~GksQueue()
  22. {
  23. Release();
  24. }
  25. void SetQueName(std::string name)
  26. {
  27. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  28. quename = name;
  29. }
  30. bool push(const T &t)
  31. {
  32. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  33. if ( m_queue.size() > m_safeCount )
  34. {
  35. printf("%s 队列溢出!!!\n", quename.c_str());
  36. return false;
  37. }
  38. m_queue.push(t);
  39. m_nCurCount++;
  40. return true;
  41. }
  42. int size(void)
  43. {
  44. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  45. int returnnum = (int)m_queue.size();
  46. return returnnum;
  47. }
  48. int pop(T &t)
  49. {
  50. //if (!empty())
  51. //{
  52. // int returnnum = 0;
  53. // EnterCriticalSection(&m_CS);
  54. // returnnum = (int)m_queue.size();
  55. // t = m_queue.front();
  56. // m_queue.pop();
  57. // LeaveCriticalSection(&m_CS);
  58. // m_nCurCount = max(0, m_nCurCount - 1);
  59. // return returnnum;
  60. //}
  61. //else
  62. //{
  63. // return false;
  64. //}
  65. //mod:20241013
  66. bool bflag = false;
  67. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  68. if (!empty())
  69. {
  70. t = m_queue.front();
  71. m_queue.pop();
  72. m_nCurCount = max(0, m_nCurCount - 1);
  73. bflag = true;
  74. }
  75. return bflag;
  76. }
  77. void pop(void)
  78. {
  79. m_nCurCount = max(0, m_nCurCount - 1);
  80. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  81. m_queue.pop();
  82. }
  83. bool empty(void)
  84. {
  85. return m_queue.empty();
  86. }
  87. void init(void)
  88. {
  89. m_safeCount = 1000;
  90. m_nCurCount = 0;
  91. quename = "未知";
  92. }
  93. void setSafeCount(int nSC)
  94. {
  95. m_safeCount = nSC;
  96. }
  97. void Clear()
  98. {
  99. std::unique_lock<std::recursive_mutex> _LOCK(m_MutexCS);
  100. //while (!empty())
  101. //{
  102. // m_queue.pop();
  103. //}
  104. std::queue<T> empty;
  105. swap(empty, m_queue);
  106. m_nCurCount = 0;
  107. }
  108. void Release(void)
  109. {
  110. Clear();
  111. }
  112. /*T front()
  113. {
  114. EnterCriticalSection(&m_CS);
  115. if (!empty())
  116. {
  117. return m_queue.front();
  118. }
  119. LeaveCriticalSection(&m_CS);
  120. }*/
  121. int GetCur_Count()
  122. {
  123. return m_nCurCount;
  124. }
  125. private:
  126. size_t m_safeCount;
  127. public:
  128. std::queue<T> m_queue;
  129. };
  130. #endif