当前位置: 首页 > news >正文

绍兴市网站建设_网站建设公司_数据统计_seo优化

电商网站购买的流程图,南通网站建设心得,深圳企业网站seo,中国最大型网站在前面的课程中呢#xff0c;我已经向你介绍了事件处理的一些基础知识#xff0c;那今天呢#xff0c;我们再来看一下外边儿rtc下事件处理的基本逻辑是什么#xff1f; 那首先呢#xff0c;我们来看一下事件是如何协调线程工作的#xff0c;那就如果这张图所展示的有两个…在前面的课程中呢我已经向你介绍了事件处理的一些基础知识那今天呢我们再来看一下外边儿rtc下事件处理的基本逻辑是什么 那首先呢我们来看一下事件是如何协调线程工作的那就如果这张图所展示的有两个线程对吧一个是限定线程一个是工作线程。其中工作线程呢 又称为等待线程它会因为一个事件而睡眠直到事件发生为止。这两个线程是如何协调工作的呢那中间儿就要有一个公共对象在外边儿tc下这个公共对象就是non socket server或者是physical socket server。这在我们上节课中都向你做过介绍了对吧 那对于工作线程来说它要等待事件就是等待。公共对象中的某个事件那当等待这个事件的时候呢整个线程就处于睡眠状态。也就不工作了。而对于信令线程或者说发送事件的线程来说呢 它会主动发送一个事件给公共对象那当公共对象收到这个事件之后呢就会将睡眠的线程。唤醒这样呢这个睡眠的线程就可以继续工作了这是事件协调线程工作的一个基本的原理OK 那下面呢我们再来看看web rtc下是如何这个控制事件的发生的那对于web rtc来说它有两个。事件的发生源那第一个呢是信令线程对吧那信令线程可以通过主动触发事件。来调用公共对象从而呢唤醒等待线程 这是第一个触发源那第二个触发源呢一般看不到。它是由系统层触发的也就是通过socket事件来触发公共对象从而将等待线程唤起。实际上呢这块知识点在我们前面的课程中呢也大概向你做了一点介绍。那这张图呢可以使你更加清楚的了解这两个事件源好那了解了上面这些知识之后呢下面我们就来看一下对于等待线程它的处理逻辑是怎样的 实际这张PPT呢我们在之前也向你做过介绍那对于等待线程来说它处理逻辑非常简单就是通过一个死循环。不断的执行那在这个执行过程中呢主要做两件事儿第一件事儿呢是通过get从队列中获取消息。如果此时队列中有消息那它就会将这个消息交给dispatch通过dispatch函数对这个消息进行处理。那如果队列中没有消息在get函数内部会进行等待也就是说指当前线程处于睡眠状态 等待时间的触发。这个逻辑呢非常的清晰那接下来呢我们来看一下get函数中做了什么事 那对于get函数来说呢它有两层循环我们来看一下。它里边逻辑是怎样的首先我们来看看在这个大的循环里边儿这个小的循环它的作用是什么那这里呢我们第一个看到的是获得锁 对吧那获得这个锁的含义是什么呢实际这个锁就是队列锁。当两个线程对同一个队列进行操作的时候那都需要先获得这把锁之后才能对队列进行操作。对于发送消息的线程来说它首先要获得这把锁之后呢才能向队列中插入消息。而对于获取数据的线程来说呢它也要先获得这把锁之后呢才能从堆列中取出消息。当获得这把锁之后我们来看get函数做了哪些事啊它首先判断这个消息队列是否为空。 那如果为空它直接就退出这个while循环了对吧那退出这个循环之后它做哪件事呢就是调socket server的weight函数。那在weight函数中呢就会调用事件等待API等待事件的触发。那如果队列不为空它就会从队列中取出这个消息并且呢将消息弹出队列并从这个函数返回。那由于p message是输出参数 所以通过它的输出参数呢那外层就可以拿到这个消息进行进一步的处理了也就是交由dispatch。进行消息的处理那所以这个逻辑啊还是非常简单的。也就是说在大的循环里头包括了两块儿一块儿呢是对队列的操作那当队列为空的时候呢它就进入睡眠状态。等待信号的触发那如果有信号过来之后。 它就会继续执行对吧那对于wait来说它可以设置成永久等待也可以设置成短时等待。如果是短时等待当超时之后。它又通过这个外部循环进入了睡眠状态这就是外层循环它的作用那内层循环呢适用于处理消息外层循环呢适用于处理当wait超时之后继续等待。OK 那这是get函数那这里呢我们还要关注一下wait函数看看wait函数里是怎么实现的对于位的函数来说呢不同的socket server它的时间是不一样的那有non socket server和physical socket server那这里呢我以physical socket server为例。来看一下位的函数的实现我们只要了解了physical socket server的实现就可以知道non socket server它是怎么做的了。好对于physical socket server的weight函数来说呢 它又一层循环对吧在这个循环里头。有一个for循环这个for循环呢是用于我们将socket与事件进行绑定的也就是调用的wsa even的select这个API。对吧这个API呢我们在前面已经向你做过详细介绍了那这个API不清楚的同学可以再翻一下上面我们讲解的内容。当所有的socket都与事件绑定之后。它会调用wsa wait for multiple events这个API那这个API实际就是对事件进行检查。 如果事件来了它就继续执行下面的操作如果没有事件它就会让这个线程呢直接在这里。进行睡眠对吧直到事件发生为止。那我们来看一下这个函数它几个参数实际这几个参数呢我们前面也做过介绍那第一个参数呢就是我们这个事件数组中。一共有多少个事件对吧第二个呢 是事件的数组第三个是是否所有的事件都触发才唤醒这个线程那FALSE呢就是只要有一个时间触发了。它就唤醒了对吧好再下一个参数负一就是永远等待直到有事件发生这个参数呢就是time out最后一个参数呢我们设成了。好那再接下来啊如果有时间触发了对于physical socket server的weight函数来说。 它要判断是哪个socket触发的事件这个时候呢在这个for循环中就会调用ws a。enumerate network event这个API那在这个API中呢它会对这个事件中的所有socket进行遍历。如果他发现输出参数evs的network events某个事件被置位了那他就进行相应的逻辑处理。那否则呢如果没有任何事件它在循环遍历下一个socket那这就是physical socket server。它的一个主要逻辑。当对于web rtc的weight实现来说呢它里边包含了很多代码这就是一个很正常的select的处理流程 这里呢是我将一些不重要的代码简化之后剩下的主干代码。那通过这个主干代码我们就可以知道它真正做了什么事了对吧好那现在呢我们就将等待线程的整个逻辑向你做了介绍首先通过get获取消息。对吧在get内部呢它会进行判断是否队列为空如果队列为空或者是没有触发socket事件。那它就会调用wait函数 最终调用wait for multiple events这个API使线程处于睡眠状态。那当有事件来了或者是队列不为空了或者是发生骚位的事件了那这个时候呢他会从睡眠状态唤起。那唤起之后呢就做后边的这段逻辑对吧对这个三维的事件进行处理或者是从队列中取出消息。一个是s时间延安在这整个过程我们了解之后呢下面我们就来看一下外边tc源码 咱们过一下这个逻辑。好我们切换到Windows系统下那在这里呢首先我们要打一些断点在哪里打呢实际主要就是在three的点CC这个文件中那这个文件是在哪个目录下呢是在rtc base下边儿的rtc base这个工程在这个工程中呢就包含了three的点儿CC文件。好在这个文件中呢首先我们可以搜一下。process.那实际上这个函数我们在前面的课程中也向你做过介绍 对吧当我们找到这个process之后呢我们看一下它的实现。这就是这里。在984行。这样呢我们就在process message这个函数中呢设一个断点在哪设呢就是在993行。在这个while循环这儿我们设一个断点这样我们就可以看到等待线程它的处理逻辑是怎样的了对吧当我们将这个断点设置好之后呢 我们将peer connection clan端给启动起来。继续执行。连接新的服务器。那这块我们先不管先继续执行。我们连接一个对端。那首先呢它会创建peer connection factory对吧这个我们在之前都讲过那在创建peer connection factory的时候呢会创建几个线程一是网络线程二是工作线程。那当线程启动起来之后呢这些线程呢 就开始工作了对于等待线程来说那它就会跳到while循环上去。处理消息我们继续执行好这是它内部去创建physical socket server对吧在创建。physical socket server的时候呢在它里边会创建一个事件hev。这个事件是用于处理消息队列的。 那还会创建另外一个事件是socket ev这个事件呢是用于处理socket消息的。 所以它一共有两个事件源这我们都看到了对吧分别是。消息队列。还有socket好我们继续执行。 那通过上面这段代码呢我们就将网络线程创建好了接下来呢它创建工作线程对于工作线程来说呢它使用的是n。设位的设备。好我们进入到这个函数中。那在这个函数中呢 684行我们可以看到。对于这个线程它使用的是non socket server对吧我们继续往下走。好这时候呢我们就将工作线程也启动起来了那当工作线程启动的时候呢我们可以看到之前创建的网络线程已经处于。等待状态了我们来看一下它的调用站。那从这个调用站中呢我们就可以知道是网络编程处于了等待状态 那首先呢我们来看一下process message等待线程或者说是网络线程。那在这个函数中呢在998行它调用了get函数对吧那在get函数中首先有一个well循环。也就是442行在这个while循环的下边又有一个while循环446行在446行这个while循环里边。它首先获得队列锁对吧451行那拿到这个锁之后呢它会做一堆逻辑那这一块逻辑呢我们暂时先不管因为它不是核心逻辑。 那核心逻辑是哪块呢是467行到472行。也就是首先判断队列是否为空如果为空就直接退出了退出之后它就进入睡眠状态。否则的话呢它就从队列中取出一个消息取出这个消息它干什么呢取出这个消息之后它就直接返回了对吧那回到上一层就会对获取到消息进行处理。那如果没有消息 它会怎么办呢它就会调用位的函数进行等待对吧好那下面呢我们再来看看wait函数做了哪些事情那wait函数呢准备执行wait for multiple events这个API了。那对于这个API来说呢它的输入参数与我们在PPT中写的是不一样的但是它的含义是类似的。也是事件的个数事件数组这个为就是当有事件来了之后就立马触发。不需要等待所有的事件都来。等待超时时间最后一是那也是类似的 那我们来看看位的函数主要都做了哪些事儿那在weight函数的一开始呢在这个循环中首先它要构造一些事件对吧都有哪些事件进行侦听那么需要把要侦听的这些事件呢塞到这个事件数组中。 之后呢它会处理所有的socket。从每一个dispatcher中拿到它的socket的描述符。那之后呢通过event select将这个socket与事件进行一个绑定对吧 之后呢当有事件发生的时候我们就可以知道是哪个socket触发的事件。好如果我们拿到的这个socket它不是一个真正的socket。那有可能是一个普通事件对吧那我们就把它当做一个普通事件塞到事件处理函数中之后呢就是调用wait for multiple event这个API。进行事件等待。当有线程触发了事件之后呢它就会对返回值做一些判断如果失败了怎么样 否则成功了它会根据返回值计算出发生事件的索引最终呢从事件。owner数组中取出对应的dispatcher。那么拿到第四拍摄之后进行相应的处理。另外呢返回的index也是有两层含义。那一种呢是普通的事件的index另外一种呢是socket index那对于socket来说。 它会进入到socket处理逻辑中就会遍历所有的dispatcher那看看是不是对应的socket触发了事件。 如果是的话就会进行socket枚举最终呢找到是谁触发的事件从而处理相应的socket对吧这就是。这段逻辑它的一个主要工作。OK那下面呢我们就来看一下是谁触发的事件呢 你继续执行。在397行的wake up socket server就是触发事件的API。那在它内部呢会调用socket server的wake up函数从而呢将等待线程换解那下面呢我们就通过这个调用站来看一下到底是谁触发的这个事件。这个调用站啊是从上到下看也就是说最顶上的是我们最近调用的函数最底下的呢是它的源就是谁调用的那首先我们将调用站往下拉动我们可以看到一个非常熟悉的身影 就是create modular peer connection factory这个API。也就显然这个事件呢是我们在调用peer connection对象的时候触发的对吧在它内部呢是做了多层的调用那这些调用呢我会在后边向你做介绍那么我们再往上找找。找谁呢找我们比较熟悉的API在这一块儿我们会看到。当peer connection factory创建成功之后呢它会调用initialize来对这个对象进行初始化。 初始化的时候又会创建China manager那manager创建好之后呢又会调用它的nit。那我们看到这个标记之后呢往上找。你就会发现在113行有一个invoke函数。 那113行的含义就是向网络线程发送一个消息那这个消息呢就是由我们括号中的这段代码来组成的。对也就是说让网络线程来执行这段代码因为是在创建peer connection factory对象所以它一定是在信令线程。所以是信令线程调用了invoke向网络线程设置的一个任务。 那这个任务是什么呢就是这个匿名函数。那这个任务就会被插入到网络线程的队列中那我们继续执行啊。那任务插入成功之后呢就会触发一个事件那这个事件呢就是由wake up socket server来触发的那在这个函数中呢又会调用。socket server的wake up函数。在wake up函数中会调用signal wake up的signal方法。好在signal方法中呢 会调用。wsa set event那像physical socket server触发一个普通事件这样呢它又开始执行1857行以后的代码了。 那以上呢就是web rtc线程事件的处理逻辑OK那通过上面的讲解呢你应该对。y8 rtc的事件处理逻辑非常清楚了对吧知道了等待线程它都做了哪些事情发送线程又做了哪些事情那关于我们在代码调试过程中出现的invoke sent post等这一类函数呢我们在后边的课程中再向你做详细介绍。 那这些呢涉及到线程的切换以及像其他线程队列中插入消息等这一系列操作那这一些呢我们都会向你做详细介绍。那我们今天的课呢就到这里有任何的问题呢您可以到讨论区或者是群里去给我留言我在那里呢给你做详细解答好谢谢。
http://www.lebaoying.cn/news/1180.html

相关文章:

  • 推网站建设话术郑州微网站制作
  • 网站浏览器兼容性问题跨境电商有什么平台
  • o2o手机网站建设难网站建设公司的转型
  • 网站建设算什么费用html5响应式网站制作
  • 网站用自己的电脑做服务器中国互联网协会是做什么的
  • 徐州网站app开发做画册好的国外网站推荐
  • 关闭网站跳转代码黄岛外贸网站建设
  • 互联免费虚拟主机淄博网站排名seo
  • 宁波江北建设局官方网站如皋网站建设
  • 021新手学做网站软件项目管理办法
  • 企业网站建设方案有那些商城网站建设专业公司
  • 沈阳做网站公司优秀网站共分享
  • 财税公司做网站手机头像制作软件app
  • html 学习网站wordpress模板如何管理
  • 聊城做网站推广找谁顺德网站建设公司咨询
  • 59网一起做网站网站关键词在哪里设置
  • 科技成果转化网站建设方案外贸网站用什么空间好
  • 网站自然排名怎么百度识图搜索图片来源
  • 死链接对网站的影响江西省建设工程协会网站查询
  • 云南旅游网站建设给个2021站你们懂得不花钱的
  • 广告手机网站制作哪个网站建设好
  • 制作一个网站步骤wordpress数据库填写
  • 网站开发怎样搭建域名历史查询工具
  • wordpress 免备案上海专业seo公司
  • 凯里有哪些网站开发公司WordPress邮箱内容修改
  • 寿光市建设局网站wordpress维护服务
  • 三亚学做网站培训天津做网站的公司有哪些
  • 定制摄影app和摄影网站的区别上海做推广的引流公司
  • 小程序服务器可以做网站吗dede替换网站模板
  • 北京做网站建设企业网站怎么做排名