#ifndef _CSERVER_WINDOW_FRAMEWORK_ #define _CSERVER_WINDOW_FRAMEWORK_ #include #include #include #include #include #include #include // Àü¹æ ÂüÁ¶ class CSysTray; class CConsoleWindow; class CCommand; class CCommandProcess; class CConsoleCMDFactory; class CIOCPNet; class CMsgProcessMgr; class CTimerProcMgr; class CPulse; class CBufferFactory; class CServerWindowFramework; // ÇÁ·Î¼¼½º ½º·¹µå class CProcessThread : public CThread { public: CProcessThread(CServerWindowFramework& ServerWindowFramework); CProcessThread(CServerWindowFramework& ServerWindowFramework, long nProcessTick); virtual ~CProcessThread(); protected: virtual void InternalRun(CPulse& Pulse) = 0; virtual void Cleanup(CPulse& Pulse) = 0; private: virtual unsigned int Run(); // ½ÇÁ¦ ½ÇÇà µÇ´Â ·çÇÁ¸¦ ³Ö´Â´Ù. virtual BOOL End() { InterlockedExchange(&m_bExit, TRUE); return TRUE; } BOOL IsEndLoop() { return InterlockedCompareExchange(&m_bExit, TRUE, TRUE); } volatile LONG m_bExit; long m_nProcessTick; CServerWindowFramework& m_ServerWindowFramework; }; class CServerWindowFramework { public: bool Initialize(HINSTANCE hInstance, const TCHAR* szWndApplicationName, const char* szCmdLine, int nICON_ID, int nMenu_ID); HWND GetWnd() { return m_hWnd; } void ProcessMessage(); bool isValid(); void PrintOutput(const char* lpFormat, ...); void PrintInfo(const char* lpFormat, ...); bool SendManageClientPacket(const void* lpData, unsigned short usLength); void SendManageClientPing(); void SetStatusFlag(unsigned long dwServerStatus) { m_dwServerStatus = dwServerStatus; } unsigned long GetStatusFlag() { return m_dwServerStatus; } CMsgProcessMgr* GetMsgProcessMgr() { return m_lpMsgProcessMgr; } CTimerProcMgr* GetTimerProcMgr() { return m_lpTimerProcessMgr; } CIOCPNet* GetIOCPNet() { return m_lpIOCPNet; } CConsoleWindow* GetConsoleWindow() { return m_lpConsoleWindow; } CCommandProcess* GetCommandProcess() { return m_lpCommandProcess; } CConsoleCMDFactory* GetCommandFactory() { return m_lpCommandFactory; } // ³»ºÎ¿¡¼­ »ý¼º private: bool InitWindow(WNDCLASS& wndClass, const char* szWndApplicationName); void Destroy(); protected: // »ó¼ÓÀ» ¹Þ¾Æ¼­ ¼¼ºÎ ³»¿ëÀ» ±¸ÇöÇϵµ·Ï ÇÔ. CServerWindowFramework(); virtual ~CServerWindowFramework(); // ¹Ýµå½Ã ÃʱâÈ­¸¦ ÇØ ÁÖ¾î¾ß ÇÔ. bool InitializeFramework(HINSTANCE hInstance, const TCHAR* szWndApplicationName, int nICON_ID, int nMenu_ID); // ¸Þ½ÃÁö ÇÁ·Î¼¼½º Ãß°¡, Ä¿¸Çµå Ãß°¡, ListenerÃß°¡ µîÀÇ Ã³¸®¸¦ ÇÑ´Ù. virtual bool ApplicationSpecificInit(const TCHAR* szCmdLine) = 0; // ó¸® ½º·¹µå Ãß°¡. bool AddProcessThread(CThread* lpProcessThread); static CServerWindowFramework* GetThisPtr(HWND hWnd) { return reinterpret_cast(GetProp(hWnd, ms_this)); } static LRESULT CALLBACK ServerWindowFrameworkProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static VOID CALLBACK FrameworkTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); private: typedef std::list ProcessThreadList; HINSTANCE m_hInstance; HWND m_hWnd; int m_nMenuID; unsigned long m_dwInternalFlags; unsigned long m_dwServerStatus; CSysTray* m_lpSysTray; // ³»ºÎ¿¡¼­ »ý¼º CConsoleWindow* m_lpConsoleWindow; // ³»ºÎ¿¡¼­ »ý¼º CCommandProcess* m_lpCommandProcess; // ³»ºÎ¿¡¼­ »ý¼º CConsoleCMDFactory* m_lpCommandFactory; // ³»ºÎ¿¡¼­ »ý¼º CIOCPNet* m_lpIOCPNet; // ³»ºÎ¿¡¼­ »ý¼º CMsgProcessMgr* m_lpMsgProcessMgr; // ¸Þ½ÃÁö ÇÁ·Î¼¼½º ¸Å´ÏÀú CTimerProcMgr* m_lpTimerProcessMgr; // ŸÀÌ¸Ó ÇÁ·Î¼¼½º ¸Å´ÏÀú CBufferFactory* m_lpBufferFactory; // ¹öÆÛ Factory ProcessThreadList m_ProcessThreadList; char m_szAppName[MAX_PATH]; static const char* ms_this; static const UINT ms_SendDataMsg; }; #endif