RTMFPManager
与RTMFPServer
同样,继承自Startable
。
class RTMFPManager : private Task, private Startable
在构造函数中将RTMFPServer
对象以引用方式传入,用以初始化其_server
引用成员。
RTMFPManager(RTMFPServer& server)
: _server(server),
Task(server),
Startable("RTMFPManager") {
start();
}
. . .
RTMFPServer& _server;
在RTMFPManager
的构造函数中调用start()
成员函数,是从Startable
继承而来的。然后会开启一个新的名为RTMFPManager
的线程。然后响应到RTMFPManager::run()
函数。
void run() {
setPriority(Thread::PRIO_LOW);
while(sleep(2000)!=STOP)
waitHandle();
}
这里要强调的是,这里的setPriority
在Linux
环境下会设置失败,可以参见我在Cumulus
在Github
上开启的Issue #75
,其中就包括这里的线程优先级设置。
在这里我们可以看到RTMFPManager
的handle(…)
中的sleep(…)
是每 2 秒一次,而这是对RTMFPServer
线程有影响的。还记得我说的RTMFPServer
线程的_wakeUpEvent
成员吗?(在《OpenRTMFP/Cumulus Primer(22)RTMFPServer线程的启动和等待》一文中)它的激活就是在RTMFPManager
中进行的,所以这里这个 2 秒是会影响到RTMFPServer
的主循环的等待时间的。
Startable::WakeUpType Startable::sleep(UInt32 timeout) {
if(_stop)
return STOP;
WakeUpType result = WAKEUP;
if(timeout>0) {
if(!_wakeUpEvent.tryWait(timeout))
result = TIMEOUT;
} else {
_wakeUpEvent.wait();
}
if(_stop)
return STOP;
return result;
}
你可以自行修改RTMFPServer
中sleep(...)
的参数,这样就会调用_wakeUpEvent.tryWait(timeout)
了,按照指定的等待时间(即timeout
)来进行睡眠。
RTMFPManager
的作用是什么呢?核心就在于它的handle
成员函数:
void handle() {
_server.manage();
}
这里就会调用到RTMFPServer::manage()
,所以你要在阅读RTMFPServer
源码时知道RTMFPServer::manage()
函数并不是在RTMFPServer
线程内运行的,而是RTMFPManager
线程内运行的。它的定义如下:
void RTMFPServer::manage() {
_handshake.manage();
_sessions.manage();
}
它实现对现有 Session 的一些管理,比如终止已经死掉的 Session。
-
转载请注明来自柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant
-