本文分析下EventThread的代码,机制以及用法
EventThread侦听EasyDarwin上的所有Socket事件。我
一. EventThread 的创建
RunServer.cpp 中StartServer函数初始化调用了 Socket::Initialize(),在该函数内即创建了EventThread类对象,但是这里仅为创建,并未启动。
- 1
- 1
二. EventThread 的启动
- 1
- 1
启动了在上一步创建的sEventThread类所对应的线程
sEventThread继承于OSThread
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
windows平台调用_beginthreadex函数创建线程,线程函数为_Entry。(有个下划线的哦)
_Entry函数如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
通过Win32宏定义来定义不同的函数原型
windows版本函数原型:
unsigned int WINAPI OSThread::_Entry(LPVOID inThread)
Linux版本函数原型:
void* OSThread::_Entry(void *inThread)
代码中继而调用theThread->Entry();转定义到EventThread::Entry()函数中
这段代码写的很棒,其中使用到了虚函数接口设计和线程TLS技术。
想了解TLS请移步:http://blog.youkuaiyun.com/haolipengzhanshen/article/details/50814369
从OSThread类继承的子类中必须实现Entry()函数(因为基类OSThread的Entry()为纯虚函数),将自己线程要执行的代码写在Entry()函数即可。
很方便有木有?真的学习到了,大赞一个
三. EventThread 的运行
EventThread::Entry()函数中开始调用select_waitevent函数监听所有的Socket端口,直到有事件发生为止
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
有Socket事件发生时处理流程:
1.构造StrPtrLen类型变量idStr,在fRefTable表中查找标识为idStr的2.OSRef类型引用。
3.通过引用指针ref查找EventContext对象
4.调用EventContext的ProcessEvent方法(重点关注)
5.在fRefTable释放ref引用指针
这里要着重关注ProcessEvent()方法:
ProcessEvent作为虚函数有两个实现,
EventContext类中实现了ProcessEvent方法(对应情况b)
EventContext的派生类TCPListenerSocket中实现了ProcessEvent方法。(对应情况a)
各位读者好好理解下面的a和b对应的内容。
a). 建立新的RTSP连接请求事件
fRefTable表插入时间: QTSServer::StartTasks()中的 fListeners[x]->RequestEvent(EV_RE);,
存入的对象为RTSPListenerSocket
调用方法: TCPListenerSocket::ProcessEvent
方法描述: 此方法调用RTSPListenerSocket的GetSessionTask方法建立一个RTSPSession,并把相应的套接口加入侦听队列,等待RTSP请求。
然后还需调用this->RequestEvent(EV_RE)把建立RTSP连接的请求加入到侦听队列。
b). 已有RTSP连接上的RTSP请求消息事件
fRefTable表插入时间: 上一步的this->RequestEvent(EV_RE)
调用方法: EventContext::ProcessEvent
方法描述: 通过Task的Signal把对应的RTSPSession类型的Task加入到TaskThread::fTaskQueue中等待TaskThread处理。
另外介绍下TCPListenerSocket::ProcessEvent方法,RTSPSession就这这里的GetSessionTask中被创建。摘取片段进行备注说明
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
看到这篇文章你已经很棒了,如果对上面的关于Task和TaskThread的内容以及操作原理理解的不够透彻,请继续看下篇文章分析。
踏踏实实的写代码,踏踏实实的做人。
本文深入分析了EventThread的工作原理及其实现方式,包括其创建、启动过程,以及如何监听Socket事件并进行处理。
1868

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



