天天看點

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. 雜記

繼續閱讀