在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来执行定时任务。
ProcessThread是WebRTC中用于执行定时任务的关键对象,它基于TaskQueueBase并实现了异步任务队列。ProcessThreadImpl作为其实现类,利用rtc::PlatformThread封装操作系统线程,并维护了一个Module列表来管理定时任务。每个Module包含TimeUntilNextProcess和Process方法,用于定义执行间隔和任务处理。ProcessThread通过遍历Module列表和处理delayed_tasks_队列来执行任务。
821

被折叠的 条评论
为什么被折叠?



