定时器、队列的逻辑。

来源:互联网 发布:清除数据后照片还在吗 编辑:程序博客网 时间:2024/06/07 01:32
//临界class CCritSec{public:    CCritSec() {        InitializeCriticalSection(&m_CritSec);    };    ~CCritSec() {        DeleteCriticalSection(&m_CritSec);    };    void Lock() {        EnterCriticalSection(&m_CritSec);    };    void Unlock() {        LeaveCriticalSection(&m_CritSec);    };protected:    CRITICAL_SECTION m_CritSec;};//链表struct LIST{bool data;LIST* pNext;};//全局临界对象CCritSec sc;//队列的头LIST* pListHead = NULL; //队列的尾LIST* pListTail = NULL; //向队列中添加一个元素DWORD WINAPI AddIntoListThread(LPVOID pParam){//加锁防止在添加时被使用sc.Lock();LIST* pNew = (LIST*)pParam;if(!pListHead){pListTail = pListHead = pNew;} else{pListTail->pNext = pNew;pListTail = pNew;}sc.Unlock();return 1;}//这个线程只需启动一次DWORD WINAPI TimeThread(LPVOID pParam){while(1){//定时器Sleep(2000);sc.Lock();LIST* pCur = pListHead;sc.Unlock();LIST* pPre = NULL;while(pCur!=NULL){//前处理部分if(data){//判断成立时删除当前元素LIST* pRemove = pCur;sc.Lock();if(pPre){pPre->pNext =  pCur->pNext;pCur = pPre->pNext;if(!pCur){pListTail = pPre;} }else{pCur = pCur->pNext;pListHead = pCur;}sc.Unlock();GlobalFree(pRemove);pRemove = NULL;}else{//移动到下一个元素sc.Lock();pPre = pCur;pCur = pCur->pNext;sc.Unlock();}}}return 0;}

原创粉丝点击