1. 总结
* CRtReactorBase::ProcessHandleEvent
此函数实际将两件事混在一起了,以后应该重构:
a) Event Queue的事件处理
b) 网络socket的处理
Q:是否只有network thread才会处理b)?查一下ProcessHandleEvent的引用地方?
* 最终与server建立连接的地方:CRtConnectorTcpT::Connect_I()
/// we regiester CONNECT_MASK prior to connect() to avoid lossing OnConnect()
RtResult rv = m_pReactor->RegisterHandler(this, IRtEventHandler::CONNECT_MASK);
if (RT_FAILED(rv))
return -1;
nRet = ::connect((RT_SOCKET)sockPeer.GetHandle(),
reinterpret_cast<const struct sockaddr *>(aAddr.GetPtr()),
aAddr.GetSize()); // 此处,终于修成成果,连接建立,tcpview.exe能看到了。
......
* 关于众多Event
IRtEvent/IEventQueue: 处理不同线程之间的信息传递机制,如PostEvent, SendEvent
IRtEventHandler:主要是指各种I/O事件,如OnInput, OnOutput, OnClose
CRtReactorBase::ProcessHandleEvent:同时指以上两种不同的event?
注:very BAD NAMING!
* Thread 与 Reactor
有很多种不同的Thread,有不同的OnThreadRun()实现,CRtThreadReactor是其中一种
CRtThreadReactor::OnThreadRun(),实现时调用pReactor->RunEvent()
2. 问题
Q:是否input与output使用了不同的connection?
似乎发送使用CConfConnection,接收使用CRtIMConnection?
最终都使用IRtTransport/CRtSocketBase?
Q:跟踪Chat信息传递全过程:Box4.2及E///代码?
Q:Conference Client的UI是如何展现出来的?ChatMainDlg如何嵌入到主UI上的?
Q:在Client/InfoServer/Controller启动完成后,列出其中的重要线程、各种重要类实例?
Q:CConfSession为什么会有一个IClientSink的实例(CConfSession本身就是一个IClientSink)?
Q:Conference Client出问题的时候,拿到的日志是什么东东?在哪里产生的?
Q:环境变量__RT_DIAGNOSE__???
#ifdef __RT_DIAGNOSE__
// Start debug module
pRunProc2();
RT_TRY
pRunProc(hInstance, lpCmdLine, nCmdShow);
RT_EXCEPT
// Stop debug module
pRunProc3();
#else
pRunProc(hInstance, lpCmdLine, nCmdShow);
#endif
什么时候__RT_DIAGNOSE__不被使用?
Q:
Q:Debug到底做什么用?是在client运行的时候向Web服务端发送相关信息以搜集出问题的时候client的状态?
Q:Conference client与server端的交互到底什么时候开始的?今天跟踪一下,搞清这个关系!!!
* LaunchConf()
# leave confefence
Q:这里其实向serer发了pdu,但居然在tcpview中没有看到有tcp连接established,奇怪了?
# IConference::CreateInstance (此时没有connection对象生成,也没有网络连接产生)
# Join Conference: CConference::JoinConference ( send request to server )
Q:仍然在tcpview中见不到网络连接
Q:CConferenceProvider里有一个Conference的列表,为什么保留这个列表?或者是因为Client/Server代码不太一样?
Q:汇总一下系统里各种有用参数的设置及默认值什么的?
Q:Conference Cilent启动后线程,除了UI主线程及网络线程,还有一个线程,干嘛用的?
NTDLL! 7c92e514()
KERNEL32! 7c802542()
CRtConditionVariableThread::Wait(CRtTimeValue * 0x00000000) line 190 + 26 bytes
CRtEventQueueUsingConditionVariable::PopOrWaitPendingEvents(std::list<IRtEvent *,std::allocator<IRtEvent *> > & {...}, CRtTimeValue * 0x00000000, unsigned long 4294967295) line 159 + 15 bytes
CRtThreadTaskWithEventQueueOnly::OnThreadRun() line 32 + 22 bytes
CRtThread::ThreadProc(void * 0x020ac8b8) line 151 + 13 bytes
_threadstartex(void * 0x020ac9d8) line 227 + 13 bytes
KERNEL32! 7c80b729()
Q:线程种类?
* 线程种类
typedef int TType;
enum
{
TT_MAIN,
TT_NETWORK,
TT_DNS, // Q:for what ?
TT_CURRENT, // Q:for what?
TT_TIMER,
TT_UNKNOWN = -1,
// This private thread type is used by applications.
TT_USER_DEFINE_BASE = 1000
};
对CRtThread的子类进行总结,并理清和CRtReactor之间的基本关系?
CRtThreadReactor: for Reactor
CRtThreadTask: for user task
Q:关于WinMain
#ifdef __RT_DIAGNOSE__
// Start debug module
pRunProc2(); // start debug mode,同时,打开了一个网络子线程,如果非diagnose模式又如何?
RT_TRY
pRunProc(hInstance, lpCmdLine, nCmdShow); // 启动会议客户端,执行初始化,创建conference及sessoin(其间与server交互数次),消息循环,
RT_EXCEPT
// Stop debug module
pRunProc3();
#else
pRunProc(hInstance, lpCmdLine, nCmdShow); // 直接启动户端,但网络线程呢??? 没有网络线程?!!
#endif
3. 杂记