OpenRTMFP/Cumulus Primer(22)RTMFPServer线程的启动和等待
1 Poco::Thread
Cumulus 大量使用了 Poco 的线程库。一个简单的 Poco 线程的使用实例如下:
class PoechantRunnable: public Poco::Runnable {
virtual void run() {
// your codes
}
};
int main() {
PoechantRunnable runnable; // Image that it's a gift
Poco::Thread thread; // And… thread is just like your girl
thread.start(runnable); // Okay, give your sweet babe the gift :)
thread.join();
return 0;
}
2 封装一个可运行线程的类
Cumulus 中实现了一个 StartableProcess 类,该类继承了 Runnable,就是上面那个 gift 喽。
class StartableProcess : public Poco::Runnable{
public:
StartableProcess(Startable& startable);
private:
void run();
Startable& _startable;
};
可以看到其中有Startable& _startable
引用成员,它并没有继承 Runnable,而是封装了StartableProcess
和Poco::Thread
:
Poco::Thread _thread;
StartableProcess _process;
这里Startable
封装了一个StartableProcess
成员,与StartableProcess
是有所区别的。接下俩我们看他们是怎么用的。
3 启动RTMFPServer线程
我们可以看到在 Startable 类的构造函数中初始化了_process
成员,初始化线程成员并传入线程名,设定标志域(Flag Field)_stop
为true
,因为它还没有调用启动函数。
Startable::Startable(const string& name)
: _name(name),
_thread(name),
_stop(true),
_haveToJoin(false),
_process(*this) {
}
初始化_process
时,调用StartableProcess
构造函数:
StartableProcess::StartableProcess(Startable& startable)
: _startable(startable){
}
传入_startable
的引用。在 Cumulus 中所有的线程的可运行类都是继承自 Startable 类的,然后通过调用 start() 来启动,启动后会响应到 run()。下面我们以 RTMFPServer 线程为例。
RTMFPServer 类是继承自 Startable 类的:
class RTMFPServer
: private Gateway,
protected Handler,
private Startable,
private SocketHandler
RTMFPServer 的构造函数:
RTMFPServer::RTMFPServer(UInt32 cores)
: Startable("RTMFPServer"),
_sendingEngine(cores),
_receivingEngine(cores),
_pCirrus(NULL),
_handshake(_receivingEngine,
_sendingEngine,
*this,
_edgesSocket,*this,*this),
_sessions(*this) {
}
其中在初始化时调用了其父类的构造函数。接下来就要启动RTMFPServer线程了。
所在线程
调用者
函数
主线程 |
main(…) |
|
主线程 |
RTMFPServer对象 |
RTMFPServer::start() |
主线程 |
RTMFPServer对象 |
Startable::start() |
主线程 |
RTMFPServer从Startable继承来的Thread成员 |
Thread::start(…) |
RTMFPServer |
RTMFPServer对象从Startable继承来的StartableProcess成员 |
StartableProcess::run() |
RTMFPServer |
RTMFPServer对象 |
RTMFPServer::prerun() |
RTMFPServer |
RTMFPServer对象 |
Startable::prerun() |
RTMFPServer |
RTMFPServer对象 |
RTMFPServer::run() |
4 RTMFPServer线程等待
在RTMFPServer::run()
实现线程的持续运行,主要是依靠这两行代码:
while (!terminate)
handle(terminate);
handle(…)
函数很简单,如下只进行了sleep(...)
和giveHandle()
两个操作。
void RTMFPServer::handle(bool& terminate){
if (sleep() != STOP) {
giveHandle();
} else
terminate = true;
}
sleep(…)
是 RTMFPServer 是从 Startable 继承而来的,声明如下:
WakeUpType sleep(Poco::UInt32 timeout=0);
定义如下:
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;
}
在运行状态下,_stop
为false
,而默认参数timeout
为0
,所以会调用:
_wakeUpEvent.wait();
这个_wakeUpEvent
成员是一个Poco::Event
对象,Poco::Event
有一个使用方式就是在调用Poco::Event::wait()
后,会一直等待Poco::Event::set()
被调用后,才会跳出 wait 的状态。在 Cumulus 中 set 的动作是由:
RTMFPServer::requestHandle()
PoolThread::push(Poco::AutoPtr<RunnableType>& pRunnable)
执行的。
-
转载请注明柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant
-
分享到:
相关推荐
OpenRTMFP Cumulus Primer()入门介绍与部署CumulusServer.pdf
这本食谱在 vanilla Debian 上创建了一个交换机覆盖,并且还部署在 Cumulus 路由器/交换机上。 要求 测试 访问 Debian Wheezy 盒子 生产 访问 Cumulus HCL [1] 开关(Accton AS6701_32X,这就是这本食谱最初的目的)...
openrtmfp又名Cumulus Server是一个完全开源和跨平台的可扩展的RTMFP服务器脚本。Cumulus Server在GPL 框架下遵循速度、优势、跨平台、轻量和高质量代码。Cumulus Server的每一个版本都是通过严格测试和审核的。可...
高性能计算云 目标 ...$ vi /opt/hpccloud/cumulus/cumulus/conf/config.json +- > Fix host to be localhost +- > baseUrl: " http://localhost:8080/api/v1 " , $ sudo service celeryd restar
有关此项目的更多信息,以及有关NASA的地球观测系统数据和信息系统(EOSDIS)及其云工作的更多信息,请联系或访问 。 :hammer: 发展 Cumulus核心回购是管理的 。 Lerna负责安装此存储库中的软件包和任务的依赖关系...
cumulus4.4.0 镜像,可加载到EVE环境。测试好使。
Hugo包含一个本地开发服务器,用于构建和查看仓库的实时更改。 要构建和查看实时站点: 从扩展安装Hugo 0.65.3版本。 用hugo version验证雨果。 该站点支持Hugo 0.65.3版。 hugo version命令的输出应为: Hugo ...
#资源达人分享计划#
这里给出了cumulus/OpenRTMFP的git官网提到的视频会话样例的AS3代码,包括服务器端和客户端两部分,我已经在<使用Cumulus和Flash Player搭建视频会议示例>http://blog.csdn.net/tao_627/article/details/18041473中给...
Cumulus是一个高级框架,可让您在Firebase之上快速而简单地开发应用程序逻辑。特征积云具有以下bonza功能: 功能端点的简单,直接配置可路由端点可路由和不可路由端点的通用接口可路由端点的命名参数(例如: /users...
积云Cumulus 是的免费、开源替代品,它利用您自己的 S3 进行存储。下载您可以在下载最新版本更改默认截图目录这是可选的。 默认情况下,OS X 会将屏幕截图放在您的桌面上。 但是,如果您希望他们去其他地方,您可以...
Cumulus API文档 Cumulus API文档: : 安装 $ npm install 建造 $ npm run build 服务 $ npm run serve 部署 $ npm run deploy
Ansible角色:Cumulus界面 该角色将在主干(和上行链路)交换机上设置OSPF(FRR)。 此外,还将在叶子交换机上配置接口并配置PoE。 Naturalis将此角色与私人库存一起使用。 要求 没有任何。 角色变量 下面列出了...
Cumulus集成测试项目[已弃用] 注意:此存储库不再维护。 该存储库的内容已移至。 什么是积云? Cumulus是NASA未来地球科学数据流的基于云的数据提取,存档,分发和管理原型。 阅读 安装 nvm use npm install 在...
用于为 Cumulus API 生成和部署仪表板的代码。 文档 其他页面: 配置 仪表板由从 Cumulus API 检索到的数据填充。 在构建和部署仪表板之前,必须预先确定和设置 Cumulus API 的环境。 配置仪表板所需的信息可在app/...
根据设计,Cumulus只会做一件事情,而一件事情做得很好:与REST资源进行交互,并自动将通过有线方式传输到本机,通用类型的数据编码/解码。 因此,您可以将Cumulus放入任何系统中,并且可以在无需对现有代码进行大量...
NULL 博文链接:https://lullabyus.iteye.com/blog/790150
大名鼎鼎的WP-CUMULUS 3D标签云,已经改成支持中文标签,可在.htm自行添加标签链接,可以单机玩耍测试,不需要安装WordPress然后装插件~~ 主要是有些童鞋只是想要3D标签云动画,所以就提取重要文件出来稍作修改下.
包括swfobject.js和tagcolud.swf中文支持文件。
不错的标签云,喜欢立体效果的博客主或者网站主可以试试看哦!强力推荐