天天看点

UC故事2011/12/07 总结与计划 (续2)

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. 杂记

继续阅读