媒体协商的多线程问题
来源:4-14 源码分析-媒体协商

奕帝传说_梦
2024-09-13
在视频中,老师多次强调了媒体协商过程在多个线程中完成,但我没有太理解为什么它们是在多个线程中的。
按照我的理解,媒体协商的调用栈如下:
- 用户双击 listBox 项
- main 函数 GetMessage 捕获鼠标事件,通过 ::DispatchMessage 分发给当前活动程序(即 main_wnd)的处理函数 WndProc()
- 调用 MainWnd::OnMessage 函数,执行 case WM_COMMAND: 分支,判断为 listbox 对象,执行 MainWnd::OnDefaultAction() 方法
- 处理与界面相关的逻辑后,通过 callback_ 也就是 conductor 对象的指针调用 Conductor::ConnectToPeer ,由 conductor 初始化peer_connection_,并使用 peer_connection_ 对象调用 CreateOffer,将 conductor 对象 (CreateSessionDescriptionObserver 接口) 以参数形式传入。
- 当 Offer 创建成功时,调用 Conductor::OnSuccess() 方法,这是一个回调函数,但按照我的理解回调函数仍然是在原调用线程执行的,并非另开了一个线程(不使用 std::async 等异步编程库时)。
- 在 OnSuccess 中执行 SetLocalDescription 方法设置本地 SDP,并调用 Conductor::SendMessage 尝试发往对端。
- 在 SendMessage 方法中调用 QueueUIThreadCallback() 方法,并声明当前事件类型为 SEND_MESSAGE_TO_PEER;然后再 QueueUIThreadCallback() 方法中调用 ::PostThreadMessage() 方法,重新插入到操作系统的消息队列中,并声明类型为 UI_THREAD_CALLBACK。
- 操作系统将该消息分发到 main 函数的消息队列中,即重新通过 GetMessage 捕获到该事件;按照我的理解,这里仍然是主线程,只不过一次新的 While 循环而已,也就是转了一圈,这种思想在高性能应用中还是很常见的。
- 然后 main 中调用 MainWnd::PreTranslateMessage() 方法,判断当前事件为 UI_THREAD_CALLBACK 类型,调用 Conductor::UIThreadCallback() 方法。
- 在 Conductor::UIThreadCallback() 方法中,判断当前事件子类型为 SEND_MESSAGE_TO_PEER,调用PeerConnectionClient::SendToPeer() 方法把 message 消息(Offer -SDP)发送给对端。
以上整个过程,我感觉由始至终都是由 主线程 完成的,没有太理解老师说的子线程是哪一部分,老师能解答一下吗?
写回答
1回答
-
李超
2024-09-13
界面是一个线程, 创建Offer是另外一个线程,你在外层调用了一个方法,但实际在webrtc 内部已经做了线程切换(也就是你调用的webrtc 函数中做的线程切换),这部分内容课程中都有讲,你现在还没看到那块,带着你的疑问继续往后看。
00
相似问题