#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; ///< ¿öÄ¿ ¾²·¹µå Á¾·áÀÇ À̺¥Æ® Çڵ鷯
|
};
|