EasyDarwin

面向企业级的流媒体平台框架

EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。

详细 >>

live555实现消息等待(非阻塞等待)


大家知道,live555为单线程执行,所以,如果执行了直接用系统函数::Sleep(Milliseconds)进行消息等待, 必然会导致消息接收函数得不到执行,即使使用另开的线程来进行消息...

大家知道,live555为单线程执行,所以,如果执行了直接用系统函数::Sleep(Milliseconds)进行消息等待, 必然会导致消息接收函数得不到执行,即使使用另开的线程来进行消息的响应,对于live555线程本身也会导致所有工作停止,这并不是我们想要的在等待的同时可以进行其他工作的sleep方法,那么在live555中如何实现消息等待呢?

在live555中可以充分用到整个线程的等待函数env->taskScheduler().doEventLoop();进行消息等待,具体实现方式为:
1.我们首先定义一个变量fWatchVariable,赋初值为0
fWatchVariable = 0;

2.在执行等待的类中定义消息响应的函数,当消息到达时可以根据消息响应码或者响应报文赋值信号量,这里假设类名为 MyClass,响应函数名称为sleep()
void MyClass::sleep(void* clientSession)
{
MyClass* obj= (MyClass*)clientSession;
obj->fWatchVariable = ~0;
}

3.在MyClass类函数中的消息等待部分加入等待3s
fWatchVariable = 0;
envir().taskScheduler().scheduleDelayedTask(3*1000000,(TaskFunc*)sleep,this);
envir().taskScheduler().doEventLoop(&fWatchVariable);

这里表示3s内doEventLoop()函数在原地循环,之后将执行sleep()函数,将fWatchVariable置为~0,如此将通过envir().taskScheduler().doEventLoop(&fWatchVariable);函数,如果需要长期等待,直到fWatchVariable = ~0的话,那么就去掉envir().taskScheduler().scheduleDelayedTask(3*1000000,(TaskFunc*)sleep,this);函数在等待的条件得到满足的时候将fWatchVariable赋值为~0即可。



------------------------------ 分割线 ------------------------------
本站文章除注明转载外,均为本站原创或编辑,欢迎大家转载,但请务必注明出处,尊重他人成果,谢谢。
转载请注明:EasyDarwin;非本站文章均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。
文章中如果有错误可联系:johnson@easydarwin.org
推荐文章
H.265技术经过2年发展,我们认为H.265高清监......>
近年来,4K超高清、H.265编码技术、视频智能......>
随着科技的发展速度,医疗行业的信息化建设......>
商场里的监控视频除了防盗,还可以做什么呢......>
家用网络摄像机则通过自身的功能帮助消费者......>
最近更新
监控行业正在发生改变,摄像头的数量在增加......>
视频编码技术是对前端摄像机采集过来的数字......>
随着网络的不断发展和应用需求的多样化,对......>
太阳能监控既从早期的贵族金字塔走向了实用......>
随着监控技术的不断发展,已经有越来越多的......>
友情链接 | 申请链接
EasyDarwin官方微信!