DataManager.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <queue>
  2. #include <thread>
  3. #include <mutex>
  4. #include <condition_variable>
  5. #include <functional>
  6. class DataProcessor {
  7. public:
  8. using DataHandler = std::function<void(const std::string&)>;
  9. DataProcessor() : m_running(true), m_worker([this] { processData(); }) {}
  10. ~DataProcessor() {
  11. {
  12. std::lock_guard<std::mutex> lock(m_mutex);
  13. m_running = false;
  14. m_Condition_.notify_one();
  15. }
  16. m_worker.join();
  17. }
  18. void setDataHandler(DataHandler handler) {
  19. m_handler = std::move(handler);
  20. }
  21. void receiveData(const std::string& data) {
  22. {
  23. std::lock_guard<std::mutex> lock(m_mutex);
  24. m_dataQueue.push(data);
  25. }
  26. m_Condition_.notify_one();
  27. }
  28. private:
  29. void processData() {
  30. while (true) {
  31. std::unique_lock<std::mutex> lock(m_mutex);
  32. m_Condition_.wait(lock, [this] {
  33. return !m_running || !m_dataQueue.empty();
  34. });
  35. if (!m_running && m_dataQueue.empty()) {
  36. break;
  37. }
  38. if (!m_dataQueue.empty()) {
  39. auto data = m_dataQueue.front();
  40. m_dataQueue.pop();
  41. lock.unlock();
  42. if (m_handler) {
  43. m_handler(data);
  44. }
  45. }
  46. }
  47. }
  48. std::queue<std::string> m_dataQueue;
  49. std::mutex m_mutex;
  50. std::condition_variable m_Condition_;
  51. DataHandler m_handler;
  52. bool m_running;
  53. std::thread m_worker;
  54. };