#pragma once #include "MemoryPool.h" class AFX_EXT_CLASS CIOCPHandler : public CMemoryPool { public: CIOCPHandler(void); virtual ~CIOCPHandler(void); BOOL Create(int nMaxNumberOfConcurrentThreads=0, int* pnOutErrCode=NULL); //!< IOCP »ý¼º ¹× ÃʱâÈ­ BOOL Associate(SOCKET hSocket, ULONG_PTR CompletionKey, int* pnOutErrCode=NULL); //!< ¼ÒÄϰú IOCP ¿Í ¿¬°á BOOL Associate(HANDLE hDevice, ULONG_PTR CompletionKey, int* pnOutErrCode=NULL); //!< ÆÄÀÏ ÇÚµé°ú IOCP ¿ÍÀÇ ¿¬°á BOOL PostCompletionStatus(ULONG_PTR CompleitonKey, DWORD dwBytesTransferred=0, OVERLAPPED* pOverlapped=NULL, int* pnOutErrCode=NULL); //!< IO Completion Queue¿¡ ÇÑ ¿Ï·á ·¹Äڵ带 »ç¿ëÀÚ Á¤ÀÇ·Î Ãß°¡ BOOL GetCompletionStatus(ULONG_PTR* pOutCompletionKey, LPDWORD pdwOutBytesTransferred, LPOVERLAPPED* pOutOverlapped, int* pnOutErrCode=NULL, DWORD dwWaitingTime=INFINITE); //!< IO Completion Queue¿¡¼­ ¿Ï·á ÆÐŶÀ» ¾ò¾î¿Â´Ù. BOOL CreateThreadPool(IIOCPProcessThread* piProcessThread, int nNumOfPooledThread=0); //!< IOCP Worker Thread Ç®À» ¸¸µë void CloseAllThreads(void); // ÇöÀç µ¹°í ÀÖ´Â ¾²·¹µå ¸ðµÎ Á×ÀÓ virtual void ProcessingThread() = 0; //!< Processing Thread ¼ø¼ö °¡»ó ÇÔ¼ö private: static DWORD __stdcall IocpWorkerThreadStartingPoint(PVOID pvParam); ///< IOCP ¿öÄ¿ ¾²·¹µå ½ÃÀÛ Æ÷ÀÎÆ®·Î¼­¸¸ÀÇ ¿ªÈ° private: HANDLE m_hIOCP; ///< IOCP Ä¿³Î °´Ã¼¿¡ ´ëÇÑ ÇÚµé int m_nCreatedThreadNumber; ///< ¸¸µé¾îÁø Worker Thread ¼ö protected: volatile LONG m_nLiveThreadNum; ///< ÇöÀç »ì¾ÆÀÖ´Â ¿öÄ¿ ¾²·¹µå ¼ö HANDLE m_EventExitWorkerThread; ///< ¿öÄ¿ ¾²·¹µå Á¾·áÀÇ À̺¥Æ® Çڵ鷯 };