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