123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #pragma once
- #include <list>
- using namespace std;
- #ifdef DRIVERAPI_EXPORTS
- #define DRIVERAPI_API __declspec(dllexport)
- #else
- #define DRIVERAPI_API __declspec(dllimport)
- #endif
- template <class T>
- class ResList
- {
- protected:
- HANDLE m_Lock;
- HANDLE m_Notify;
- PVOID m_Queue;
- public:
- ResList::ResList(void)
- {
- m_Notify = CreateEvent(0,0,0,0);
- m_Lock = CreateMutex(0,0,0);
- list<T> *pQue = new list<T>;
- if(pQue)
- {
- m_Queue = (PVOID)pQue;
- }
- else
- {
- m_Queue = NULL;
- }
- };
- ResList::~ResList(void)
- {
- if(m_Queue)
- {
- list<T> *pQue = (list<T>*)m_Queue;
- delete pQue;
- m_Queue = NULL;
- }
- CloseHandle(m_Lock);
- };
- void Clear()
- {
- WaitForSingleObject(m_Lock,INFINITE);
- ((list<T>*)m_Queue)->clear();
- ReleaseMutex(m_Lock);
- }
- DWORD Size()
- {
- DWORD ret = 0;
- WaitForSingleObject(m_Lock,INFINITE);
- ret = ((list<T>*)m_Queue)->size();
- ReleaseMutex(m_Lock);
- return ret;
- };
- void PushQue(T &obj)
- {
- WaitForSingleObject(m_Lock,INFINITE);
- ((list<T>*)m_Queue)->push_back(obj);
- ReleaseMutex(m_Lock);
- SetEvent(m_Notify);
- };
- bool PopQue(T &obj)
- {
- bool ret = false;
- WaitForSingleObject(m_Lock,INFINITE);
- if(((list<T>*)m_Queue)->size() > 0)
- {
- obj = ((list<T>*)m_Queue)->front();
- ((list<T>*)m_Queue)->pop_front();
- ret= true;
- }
- ReleaseMutex(m_Lock);
- return ret;
- };
- bool WaitForInQue(T &obj,DWORD timeout)
- {
- if(PopQue(obj))
- {
- return true;
- }
- if(WaitForSingleObject(m_Notify,timeout) == WAIT_OBJECT_0)
- {
- return PopQue(obj);
- }
- return false;
- }
- };
|