TeamTalk客户端源码分析四

版权声明:本文为博主原创文章,如需转载请注明出处 https://blog.csdn.net/bajianxiaofendui/article/details/85054799

     在TeamTalk中有很多http操作,比如获取消息服务器ip地址,获取好友头像,聊天时发送图片等等,为了让这些网络请求不阻塞主线程的运行,TeamTalk中使用了http线程池的概念,将http请求放到工作线程中去执行,执行完毕后再通过异步回调到主线程。下面我们来详细介绍下它的实现。

一,IHttpOperation

     在我们第一章和第二章中介绍回调机制时,有提到过一个UIEventManager类,这个类主要是通过创建一个消息窗口,来连接工作线程和UI线程的通知。
在IModuleInterface.h中有一个回调类,它实现了同步回调和异步回调两种接口,而异步回调就是通过UIEventManager的消息窗口来实现的。
在这里插入图片描述
     IHttpOperation类是一个纯虚类,只是对ICallbackOpertaion的继承,让具体的业务操作类来实现具体的接口,同时构造函数把回调仿函数callback传到了ICallbackOpertaion中。最终通过调用基类ICallbackOpertaion的asyncCallback来达到异步回调的效果(在asyncCallback中再调用callback)。

一,IHttpPoolModule和HttpPoolModule_Impl

     IHttpPoolModule也是一个虚基类,继承自我们前面讲过的ModuleBase,但是这里的继承并没有用到ModuleBase的任何特性,暂时不管它。
     HttpPoolModule_Impl继承自IHttpPoolModule,实现了虚函数pushHttpOperation,把http请求都加到std::listmodule::IHttpOperation*链表中,供下面的TTHttpThread去遍历取链表头结点。这是一个很常见的生产者消费者模式(生产者消费者的实现可以参考我另一篇博客c++实现生产者-消费者模式),这里使用的是Semaphore信号量来对链表进行加锁处理。
     HttpPoolModule_Impl也是一个单例类,全局只有一个实例。
在这里插入图片描述

一,TTThread和TTHttpThread

     TTThread的声明和实现在工程utility中,它就是一个win32线程的封装类,在内部实现了线程的创建,线程的销毁和线程资源的释放。
在这里插入图片描述
     在线程回调函数中,调用了虚函数process()来处理业务,那么相应的,我们的线程类需要继承自TTThread,重写process()来实现自己的功能。
在这里插入图片描述
     所以我们就有了TTHttpThread类,重写process()函数,遍历HttpPoolModule_Impl中的每一个IHttpOperation对象,执行IHttpOperation的process函数。
在这里插入图片描述
在process中调用了processOpertion,然后业务类继承IHttpOperation,并重写processOpertion。以“下载头像”功能为例,在processOperation中执行了http的get请求来下载用户头像。
在这里插入图片描述
在nbsp;    看到这里,整个流程就很清楚了,把http请求(IHttpOperation继承类)加入链表,开启线程从链表中取出链表头结点,然后调用各个IHttpOperation继承类的process函数来执行http操作,再通过ICallbackOpertaion的asyncCallback函数将请求结果异步回调到UI线程,进行界面的展示处理。
下一章我们具体讲解Http::HttpRequest这些封装类的实现。

猜你喜欢

转载自blog.csdn.net/bajianxiaofendui/article/details/85054799