Linux高级环境编程实验报告3.doc_第1页
Linux高级环境编程实验报告3.doc_第2页
Linux高级环境编程实验报告3.doc_第3页
Linux高级环境编程实验报告3.doc_第4页
Linux高级环境编程实验报告3.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

作 业 报 告学生姓名: 学 号: 指导教师:学生E-mail: 一、作业名称: 自定义消息队列二、作业要求 自行设计一个消息队列(不能依赖已有库的队列),实现一般队列的操作:入列、出列以及队列判空,另外要保证线程安全,并且能够接收CLMessage类继承体系的消息;需要提供发送消息的通信类,以及循环消息的管理类,保证能够支持线程之间的通信。三、设计与实现根据要求分析,首先不能依赖已有库的队列,我们可以利用单链表来创建一个队列,对于消息的出队与入队操作,需要设定两个指针,头指针和尾指针,分别指向队头和队尾,根据队列的要求,队头处只能读(出队),队尾只能写(入队)。对于判空操作,设定队头指针等于队尾指针时为空。代码清单3.1 自定义队列的实现struct CLNode/链表节点 T data; struct CLNode *next;template class CLMyQueueprivate: struct CLNode *QueueHead;/队头指针 struct CLNode *QueueTail;/队尾指针public: CLMyQueue(); CLMyQueue(); void Push(T data); /数据入队操作 T Pop(); /数据出队操作 bool IsEmpty();/不能从空队列读数据,因此需进行队列判空 ;template CLMyQueue:CLMyQueue()/构造函数中对队列进行初始化操作,队头、队尾置空 QueueHead = NULL; QueueTail = NULL;template CLMyQueue:CLMyQueue()/析构函数清空队列中的所有数据 while (QueueHead != NULL) /队头不为空,则清除队头,继续找队头的后继结点,删除所有的结点数据 struct CLNode *t = QueueHead; QueueHead = QueueHead-next; delete t; template void CLMyQueue:Push(T data)/数据入队操作 if (IsEmpty()/如果队列为空,将数据入队,并且队头和队尾指针都指向该数据 QueueHead = new struct CLNode; QueueHead-data = data; QueueTail = QueueHead; return; /在队尾插入数据 struct CLNode *newNode = new struct CLNode; newNode-data = data; newNode-next = NULL; QueueTail-next = newNode; QueueTail = newNode;template T CLMyQueue:Pop()/数据出队操作 if (IsEmpty()/不能从空队列中读数据,因此判定队列是否为空,空则返回空指针 return NULL; T data = QueueHead-data;/取出对头数据,并修改队头指针 struct CLNode *t = QueueHead; QueueHead = QueueHead-next; delete t; return data;template bool CLMyQueue:IsEmpty()/判断队列是否为空 if (QueueHead = NULL) /当队头指针为空时,队列为空 return true; return false;代码清单3.1给出了自定义消息队列的实现。开始定义了单链表结点的结构。在自定义队列类CLMyQueue中给出了入队和出队的操作,分别是Push和Pop函数,当然,要注意一些细节,在出队时要判断队列是否为空,若为空则无法进行出队操作,同样在进行入队操作是要判断是否队满。四、测试自定义两个CLMessage类的继承体,封装乘法操作的CLMultipMessage消息类和CLQuitMessage退出消息类,定义子线程的回调函数,即子线程的执行体。在main()函数中,创建子线程,主线程向消息队列传递CLSUBMessage消息和CLQuitMessage消息。子线程从队列中获取消息,并执行相应消息体操作如减法操作和退出操作。代码清单4.1 测试代码class CLMsgPro;class CLMultipMessage : public CLMessage /继承CLMessage的乘法消息public: friend class CLMsgPro; CLMultipMessage(int Op1,int Op2):CLMessage(MULTIP_MSG) /构造函数初始化 m_Op1=Op1; m_Op2=Op2; virtual CLMultipMessage() int m_Op1; int m_Op2;class CLQuitMessage : public CLMessage /继承CLMessage的退出消息public: CLQuitMessage() : CLMessage(QUIT_MSG) virtual CLQuitMessage();class CLMsgPro : public CLMessageObserver /CLMsgPro继承CLMessageObserver,是线程执行体public: CLMsgPro() virtual CLMsgPro() virtual CLStatus Initialize(CLMessageLoopManager *pMessageLoop, void* pContext) /注册回调函数到线程,用于绑定,可以找到具体做什么操作 pMessageLoop-Register(MULTIP_MSG, (CallBackForMessageLoop)(&CLMsgPro:Do_MultipMsg);pMessageLoop-Register(QUIT_MSG, (CallBackForMessageLoop)(&CLMsgPro:Do_QuitMsg); return CLStatus(0, 0); CLStatus Do_MultipMsg(CLMessage *pM) CLMultipMessage *pMultipMsg = (CLMultipMessage *)pM; coutm_Op1*pMultipMsg-m_Op2endl; /加法消息return CLStatus(0, 0); CLStatus Do_QuitMsg(CLMessage *pM)coutquit.endl; /退出消息return CLStatus(QUIT_MESSAGE_LOOP, 0);int main()CLThreadForMsgLoop myTthread(new CLMsgPro, childThread, true); /创建线程myTthread.Run(0);CLExecutiveNameServer:PostExecutiveMessage(childThread, new CLMultipMessage(3,2); /向childThread线程发送消息 CLExecutiveNameServer:PostExecutiveMessage(childThread, new CLQuitMessage();return 0;代码清单4.1是自定义消息队列程序的测试代码,在main函数中创建CLThreadForMsgLoop类的对象,向childThread线程发送乘法消息,提供参数3和2(做3*2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论