12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #ifndef DATAPipe_H
- #define DATAPipe_H
- #include <queue>
- #include <thread>
- #include <memory>
- #include <mutex>
- #include <condition_variable>
- #include <functional>
- #include "DataPackage.h"
- #define BUFFER_SIZE 30
- template <typename T>
- class DataPipe
- {
- public:
- DataPipe(size_t bufferSize = BUFFER_SIZE);
- ~DataPipe();
- void pushData(T *data);
- bool popData(T *&data);
- private:
- size_t m_bufferSize;
- std::queue<T *> m_bufferQueue;
- std::mutex m_mtx;
- std::condition_variable m_cv;
- };
- template <typename T>
- DataPipe<T>::DataPipe(size_t bufferSize) : m_bufferSize(bufferSize) {}
- template <typename T>
- DataPipe<T>::~DataPipe() {}
- template <typename T>
- void DataPipe<T>::pushData(T *data)
- {
- std::unique_lock<std::mutex> lock(m_mtx);
- if (m_bufferQueue.size() >= m_bufferSize)
- {
- m_bufferQueue.pop();
- }
- m_bufferQueue.push(data);
- m_cv.notify_one();
- }
- template <typename T>
- bool DataPipe<T>::popData(T *&data)
- {
- std::unique_lock<std::mutex> lock(m_mtx);
- if (m_bufferQueue.empty())
- {
- return false;
- }
- data = m_bufferQueue.front();
- m_bufferQueue.pop();
- return true;
- }
- typedef std::shared_ptr<DataPipe<DataPackage>> DataPipePtr;
- #endif // DATAPipe_H
|