5.13.Post方法进行线程切换

在上节课中呢,我向你介绍接口调用过程中啊,曾经看到过post方法。当时我已经向你解释过pose方法呢,就是从一个线程切换到另外一个线程,那整个的过程呢,非常简单,就是从发送线程创建一个消息。塞到接收线程的队列之后呢?再由接收线程来进行处理,那其原理呢?就如这张图所展示的。
5.13.Post方法进行线程切换_第1张图片

线程一。它输出一个消息。输出到线程二的消息队列中,那么线程二呢?不停的从这个消息队列中获取消息。每获取到一个消息之后呢,都由线程二进行操作,这就是线程切换的原理非常简单。好,那我们来看看外部rtc线程切换都有哪些方法?首先呢,最根本的一个方法就是post方法,那么除了post方法呢,还有很多的衍生方法。比如说post task方法。
5.13.Post方法进行线程切换_第2张图片

那对于post以及post task,它都属于异步调用方法。那什么意思呢?就是说发送线程只需要将我要处理的消息告诉接收线程,或者说目标线程执行就OK了。那他自己呢,可以继续向下执行,所以他是异步的。而像send方法以及invoke方法等等,这些其他方法呢?它是同步方法,也就是说发送线程将消息告诉接收线程之后。那接收线程处理完消息之后呢,还要通知发送线程说我这件事已经做好了。那此时呢,

发送线程才可以继续执行,否则的话,它就一直等待。直到接收线程通知我为止,对这就是同步切换方法,那所以呢,我们现在应该知道。对于wab 2t4来说呢,它提供了两大类线程切换的方法,一大类呢,是以post开头的post某某某方法。这是异步线程切换,还有一种是send invoke为开头的,它是同步线程切换。那我们知道它们之间的区别就OK了。
5.13.Post方法进行线程切换_第3张图片

好,那对于这节课来说呢,我们重点介绍post方法,那首先呢,我们来看看post方法定义,那对于post方法来说呢它?包括的输入参数啊,还蛮多的。那第一个参数呢,是location类型。post from.实际它就是一个宏,那通过这个参数呢,目标线程就知道这个任务是从什么地方来的。那它有一什么好处呢?

好处就是可以让目标线程知道这个任务是由谁发送的,这样当我们调试的时候,我们也好确认。这个任务是由谁发送的?在什么地方发送的?那当我们遇到问题的时候呢,我们就能很好的确定这个问题到底从哪儿出现的是吧?这是location,它的一个作用,那在后边呢?是message handler类型的对象对吧?这个对象里包含了一个啊message方法。每当我们将一个消息告诉给目标线程之后,目标线程在执行的时候就会调用message handler中的on message方法。进行这个消息的处理,

具体的逻辑是什么?那是由message handler来确定的。再下边呢,是一个ID,那ID呢,通常都设成零目前呢,我们不太用这个参数,再接下来的data就是message data。它的作用呢,就是message handler在处理消息的时候,要对不同的数据进行区别对待。那具体怎么区分这个数据呢?就通过这个message data,那这个呢?就是用户提供的数据类型。

那在message handled中呢,就要根据message date中的具体内容来做具体的处理。所以这是message data,它的作用,那再下一个呢,就是对时间是否敏感,对吧?有些消息是时间敏感的,有些呢,是不太敏感的。那对于不太敏感的,可以delay执行的,可以放在delay队列中比较急切的,我们可以放在立即处理队列中。那这样呢,

可以对消息呢,做一次分级是吧?这就是pose方法的一个定义。好,那接下来呢?我们来看看post方法的实现,那在post方法中当收到输入参数之后。它首先将输入参数打包到一个消息中,也就是message消息中之后呢,将这个消息插入到message队列中,最后通过wake up socket server。来将目标线程唤醒。所以通过这个方法,我们可以知道,在我们调用的时候,
5.13.Post方法进行线程切换_第4张图片

一定是要调用某个线程的post。将输入参数传进去之后,那么在这个中呢?它会对输入参数重新构造,构造成一个message,然后插入到自己现成的这个message队列中。最后呢,这个线程如果它处于睡眠状态,就将它唤醒,如果没有处于睡眠状态,这个实际就不做任何的操作。这就是post方法的实践逻辑非常的简单。好,那接下来呢?我们看看目标线程,

它是怎么做的?那首先我们要知道目标线程,它启动是如何启动的?通过create three的创建一个线程创建之后呢,执行pre run在pre run中呢,又会调用run方法。最后,run方法中调用process message方法对吧?所以这个process message。这里边儿的逻辑啊,非常重要,那我们来看一下process message中它是怎么做的?那在这个函数中呢?处理逻辑也非常简单,它就是一个死循环。5.13.Post方法进行线程切换_第5张图片

一直在运行,在干什么呢?就是get message从哪get呢?就是从这个线程的message队列中。获取消息。如果此时message队列已经是空的,那么在get中它会睡眠,等待队列有数据的通知。对吧,一旦队列中有数据,它就可以获取到里边儿的消息,最后呢,通过diss配置。对这个消息进行处理。那在前面的课程中,

我已经对get里边的实验逻辑向你做了详细介绍了,现在记不清的同学呢,可以再翻过去看一看。get它是如何实验的?那今天呢?我们重点介绍一下dispatch message,看看dispatch message中是怎么处理这个消息的?好,对于dispatch message来说,它处理消息啊,实际就是调用其message中的handler。也就是post函数中的第二个参数。这用它里边儿的on message方法来处理这个消息,那么具体on message中是怎么做的?每个实现逻辑都是不一样的。
5.13.Post方法进行线程切换_第6张图片

所以要根据具体的逻辑去分析on message中它是怎么处理这个message消息的。所以通过这个函数,我们可以知道什么呢?就是发送线程,将它要实现的所有逻辑都实现好了。实现好之后呢,他只不过把这个任务交给了目标线程,让目标线程去执行这个任务。那具体怎么执行?就是按照发送线程给你写好的逻辑去进行执行,所以通过这个dispatch,我们也可以知道。web rtc它整个处理消息的逻辑以及线程之间的关系就非常清楚了,那以上呢,就是我们这节课所要介绍内容,

那在这节课中呢,主要是向你分析了一下。y8 tc最基础的线程切换post方法,它是如何实现的?它的接口是怎么样的?我们如何调用它?在调用之后,它内部是怎样的逻辑目标线程,又是如何处理消息的?整个这套过程向你做了详细介绍。那了解了这个过程之后呢,我们再去看外边线程切换代码就非常容易了,那我们今天的课呢,就到这里,谢谢。

你可能感兴趣的:(webrtc)