TeamTalk客户端源码分析四

古城微笑少年丶 2022-04-04 14:16 394阅读 0赞

TeamTalk客户端源码分析四

  • 一,IHttpOperation
  • 一,IHttpPoolModule和HttpPoolModule_Impl
  • 一,TTThread和TTHttpThread

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

一,IHttpOperation

  1. 在我们第一章和第二章中介绍回调机制时,有提到过一个UIEventManager类,这个类主要是通过创建一个消息窗口,来连接工作线程和UI线程的通知。

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

一,IHttpPoolModule和HttpPoolModule_Impl

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

在这里插入图片描述

一,TTThread和TTHttpThread

  1. 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这些封装类的实现。

发表评论

表情:
评论列表 (有 0 条评论,394人围观)

还没有评论,来说两句吧...

相关阅读