webrtc中的线程(二)ProcesThread


在webrtc中另外一个用的比较多的线程对象是 ProcessThread,它主要用于执行定时任务。它的实现相较 rtc::Thread也简单些。

类图

类图.pngProcessThread继承自TaskQueueBase,所以它也是一个异步任务队列。它也是一个接口,具体实现类为ProcesThreadImpl

成员变量

因为它是一个异步任务队列,它内部的队列就是std::queue<QueuedTack*> queue_,而rtc::Event wake_up_就是驱动队列的事件:当队列为空时,线程阻塞在wake_up_上;当往队列放入任务,则通过wake_up_唤醒线程。

ProcessThreadImplrtc::Thread不同,它并没有直接封住操作系统的线程类API,而是使用了rtc::PlatformThread线程对象,rtc::PlatformThread就是对操作系统线程类API的封装。

ModuleList modules_是定时任务队列,执行定时任务队列是ProcessThreadImpl的主要功能。

核心方法

ProcessThreadImpl的核心方法是bool Process(),代码框架如下:

bool ProcessThreadImpl::Process() {
    
    
    ...
    //执行定时任务
    for (ModuleCallback& m : modules_) {
    
    
    	if (m.next_callback == 0)
        	m.next_callback = GetNextCallbackTime(m.module, now);

      	if (m.next_callback <= now ||
          m.next_callback == kCallProcessImmediately) {
    
    
        	{
    
    
          		m.module->Process();
        	}
        
        	int64_t new_now = rtc::TimeMillis();
        	m.next_callback = GetNextCallbackTime(m.module, new_now);
      	}

      	if (m.next_callback < next_checkpoint) {
    
    
        	next_checkpoint = m.next_callback;
    	}
    }

	//执行delayed_tasks_中的任务
    while (!delayed_tasks_.empty() && delayed_tasks_.top().run_at_ms <= now) {
    
    
      	queue_.push(delayed_tasks_.top().task);
      	delayed_tasks_.pop();
    }

    if (!delayed_tasks_.empty()) {
    
    
      next_checkpoint =
          std::min(next_checkpoint, delayed_tasks_.top().run_at_ms);
    }

	//执行queue_中的任务
    while (!queue_.empty()) {
    
    
      QueuedTask* task = queue_.front();
      queue_.pop();
      ...
      if (task->Run()) {
    
    
        delete task;
      }
      ...
    }

	//等待在wake_up_上
   	int64_t time_to_wait = next_checkpoint - rtc::TimeMillis();
  	if (time_to_wait > 0)
    	wake_up_.Wait(static_cast<int>(time_to_wait));
}

实现还是比较简单,就是依次执行几个任务队列中的任务。

成员方法

  • void PostTask(std::unique_ptr<QueuedTask> task)
  • void PostDelayedTask(std::unique_ptr<QueuedTask> task,uint32_t milliseconds)

两个Post方法是继承自TaskQueueBase,也不像rtc::Thread提供了更多种类的Post方法。

  • void RegisterModule(Module* module, const rtc::Location& from)
  • void DeRegisterModule(Module* module)

这两个方法是ProcessThreadImpl主要功能方法,就是往Module list中插入或删除Module,一个Module就是一个定时任务,它是一个接口类,定义如下:

class Module {
    
    
public:
    virtual int64_t TimeUntilNextProcess() = 0;
    virtual void Process() = 0;
};

TimeUntilNextProcess就是返回执行间隔。

ProcessThread在Pacing,audio 模块都有用到,主要用法就是注册Module来执行定时任务。

猜你喜欢

转载自blog.csdn.net/mo4776/article/details/129484307