日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

WSF操作系统抽象层学习笔记(三)---消息列队

發(fā)布時(shí)間:2024/1/1 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WSF操作系统抽象层学习笔记(三)---消息列队 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

消息

WSF的消息服務(wù)用于傳遞消息到對(duì)應(yīng)的事件處理句柄。

實(shí)現(xiàn)機(jī)制和使用方法

  • 基于內(nèi)存管理,從內(nèi)存中申請(qǐng)sizeof(wsfMsg_t) + 消息長(zhǎng)度的內(nèi)存。添加頭部描述,返回給申請(qǐng)者除去頭部的指針位置。
  • 將消息添加到對(duì)應(yīng)事件處理具柄上去。
  • 對(duì)應(yīng)任務(wù)取出列隊(duì),處理完畢后將消息釋放。
  • //消息隊(duì)列的管理結(jié)構(gòu)。 typedef struct wsfMsg_tag {struct wsfMsg_tag?? *pNext;???????? //指向下一個(gè)消息的指針wsfHandlerId_t????? handlerId;???? //消息對(duì)應(yīng)的處理句柄 } wsfMsg_t;//為當(dāng)前消息申請(qǐng)len 長(zhǎng)度消息和 tailroom長(zhǎng)度消息內(nèi)容 void *WsfMsgDataAlloc(uint16_t len, uint8_t tailroom) {return WsfMsgAlloc(len + tailroom); }//申請(qǐng)一個(gè)消息的長(zhǎng)度 void *WsfMsgAlloc(uint16_t len) {wsfMsg_t *pMsg;//申請(qǐng)的長(zhǎng)度包含本身消息結(jié)構(gòu)的長(zhǎng)度pMsg = WsfBufAlloc(len + sizeof(wsfMsg_t));/* 返回的地址需要去除消息頭的長(zhǎng)度 */if (pMsg != NULL){pMsg++;}return pMsg; }//消息使用完畢后,將消息占用的內(nèi)存釋放 void WsfMsgFree(void *pMsg) {//釋放時(shí)同時(shí)要將消息頭部的內(nèi)存釋放WsfBufFree(((wsfMsg_t *) pMsg) - 1); }

    消息的發(fā)送

    ? ? ? ??將消息添加到handleID對(duì)應(yīng)的列隊(duì)中,并給這個(gè)handleID設(shè)置消息隊(duì)列的事件。

    //將消息發(fā)送給對(duì)應(yīng)的處理句柄 void WsfMsgSend(wsfHandlerId_t handlerId, void *pMsg) {WSF_TRACE_MSG1("WsfMsgSend handlerId:%u", handlerId);/* 根據(jù)handleId獲取當(dāng)前任務(wù)的msg_queue,然后將消息添加到隊(duì)列中 */WsfMsgEnq(WsfTaskMsgQueue(handlerId), handlerId, pMsg);/* 向?qū)?yīng)的task發(fā)送有列隊(duì)的事件,以保證后續(xù)可以處理改消息 */WsfTaskSetReady(handlerId, WSF_MSG_QUEUE_EVENT); }

    消息的管理

    ? ? ? ? 主要進(jìn)行消息的出隊(duì)和如隊(duì)的操作。操作的時(shí)候需要注意消息頭部的管理。入隊(duì)時(shí)需要找到消息的頭部節(jié)點(diǎn),出隊(duì)時(shí)需要將頭部節(jié)點(diǎn)去除后將消息傳遞給用戶。

    //將消息添加到消息隊(duì)列 void WsfMsgEnq(wsfQueue_t *pQueue, wsfHandlerId_t handlerId, void *pMsg) {wsfMsg_t *p;WSF_ASSERT(pMsg != NULL);/* 需要找到從消息頭部開始的地方 */p = ((wsfMsg_t *) pMsg) - 1;/* 設(shè)置消息處理的handleId */p->handlerId = handlerId;WsfQueueEnq(pQueue, p); }//從消息隊(duì)列中取出一個(gè)消息 void *WsfMsgDeq(wsfQueue_t *pQueue, wsfHandlerId_t *pHandlerId) {wsfMsg_t *pMsg;if ((pMsg = WsfQueueDeq(pQueue)) != NULL){*pHandlerId = pMsg->handlerId;/* 需要去除消息的頭部 */pMsg++;}return pMsg; }//從消息隊(duì)列中取出一個(gè)消息,但不從列隊(duì)中刪除 void *WsfMsgPeek(wsfQueue_t *pQueue, wsfHandlerId_t *pHandlerId) {wsfMsg_t *pMsg = pQueue->pHead;if (pMsg != NULL){*pHandlerId = pMsg->handlerId;/* 需要去除消息的頭部 */pMsg++;}return pMsg; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的WSF操作系统抽象层学习笔记(三)---消息列队的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。