在webrtc中另外一个用的比较多的线程对象是
ProcessThread
,它主要用于执行定时任务。它的实现相较
rtc::Thread
也简单些。
类图
ProcessThread
继承自TaskQueueBase
,所以它也是一个异步任务队列。它也是一个接口,具体实现类为ProcesThreadImpl
。
成员变量
因为它是一个异步任务队列,它内部的队列就是std::queue<QueuedTack*> queue_
,而rtc::Event wake_up_
就是驱动队列的事件:当队列为空时,线程阻塞在wake_up_
上;当往队列放入任务,则通过wake_up_
唤醒线程。
ProcessThreadImpl
与rtc::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
来执行定时任务。