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