00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #if !defined(AFX_SOCKETTHREADMANAGER_H__74FE76EA_CB87_4F58_8F81_AA23A971A332__INCLUDED_)
00037 #define AFX_SOCKETTHREADMANAGER_H__74FE76EA_CB87_4F58_8F81_AA23A971A332__INCLUDED_
00038
00039 #if _MSC_VER > 1000
00040 #pragma once
00041 #endif // _MSC_VER > 1000
00042
00043 #pragma warning(disable : 4786)
00044
00045 #include "ErrorHandler.h"
00046
00047 #include <map>
00048
00049
00050 #define SOCKET_WINDOW_NAME "Socket notification sink"
00051
00052
00053 #define MAX_THREADS 200
00054
00055 KOMODIA_NAMESPACE_START
00056
00057 class CGenericCriticalSection;
00058 class CGenericThread;
00059 class CGenericEvent;
00060
00061 class CSocketThreadManager : public CErrorHandler
00062 {
00063 public:
00064
00065 typedef void (*TimeoutProc)(LPVOID pParam);
00066 typedef TimeoutProc LPTimeoutProc;
00067
00068
00069 typedef struct _TimerID
00070 {
00071 int iTimerID;
00072 int iIndex;
00073 int iMS;
00074 } TimerID;
00075 public:
00076
00077 const std::string& GetClassName()const;
00078
00079
00080 BOOL ReSetTimeout(const TimerID& rTimerID);
00081
00082
00083 BOOL RemoveTimeout(TimerID& aTimerID);
00084
00085
00086
00087
00088
00089
00090 TimerID RegisterTimeout(int iMS,
00091 LPTimeoutProc pProc,
00092 LPVOID pData,
00093 BOOL bClearTimeout=FALSE,
00094 HWND hHandle=NULL,
00095 TimerID* pTimer=NULL);
00096
00097
00098 void DecreaseSocketCount(HWND hWindowHandle,
00099 BOOL bFreeze=FALSE);
00100
00101
00102 void DecreaseTimeoutCount(HWND hWindowHandle,
00103 BOOL bFreeze=FALSE);
00104
00105
00106 HWND GetWindowHandle(BOOL bTimeout=FALSE);
00107
00108
00109 BOOL Initialize(unsigned long ulThreadCount,
00110 LPCSTR lpClassName);
00111
00112
00113 BOOL Uninitialize();
00114
00115
00116 CSocketThreadManager(HINSTANCE hInstance);
00117 virtual ~CSocketThreadManager();
00118 private:
00119
00120 CSocketThreadManager(BOOL bStatic);
00121
00122
00123 typedef struct _TimeoutData
00124 {
00125 LPTimeoutProc pTimeoutProc;
00126 LPVOID pData;
00127 BOOL bClearTimeout;
00128 TimerID* pTimer;
00129 } TimeoutData;
00130
00131
00132 typedef std::map<unsigned int,TimeoutData> TOMap;
00133 private:
00134
00135 CSocketThreadManager(const CSocketThreadManager& rManager);
00136
00137
00138 CSocketThreadManager& operator=(const CSocketThreadManager& rManager);
00139
00140
00141 BOOL RegisterClass(LPCSTR lpClassName);
00142
00143
00144 BOOL UnregisterClass();
00145
00146
00147 void CleanThreads(BOOL bError);
00148
00149
00150 int GetIndexByHWND(HWND hHandle)const;
00151
00152
00153 int GetMostAvailableThread()const;
00154
00155
00156 static DWORD SocketThread(LPVOID lpParameter);
00157
00158
00159 BOOL SpawnThreads(LPCSTR lpClassName);
00160
00161
00162 typedef struct _ThreadData
00163 {
00164 HWND hWindowHandle;
00165 int iSocketCount;
00166 int iTimeoutCount;
00167 BOOL bFreeze;
00168 CGenericThread* pThread;
00169 HINSTANCE hInstance;
00170 CGenericEvent* pEvent;
00171 TOMap pMap;
00172 std::string sClassName;
00173 CGenericCriticalSection* pCSection;
00174 } ThreadData;
00175
00176
00177 unsigned long m_ulThreadCount;
00178
00179
00180 ThreadData* m_pThreadData;
00181
00182
00183 HINSTANCE m_hInstance;
00184
00185
00186 CGenericCriticalSection* m_pCSection;
00187
00188
00189 static BOOL m_bRegisteredWindow;
00190
00191
00192 static CSocketThreadManager m_sManager;
00193
00194
00195 BOOL m_bStaticClass;
00196
00197
00198 std::string m_sClassName;
00199
00200
00201 BOOL m_bInitialized;
00202 };
00203
00204 KOMODIA_NAMESPACE_END
00205
00206 #endif // !defined(AFX_SOCKETTHREADMANAGER_H__74FE76EA_CB87_4F58_8F81_AA23A971A332__INCLUDED_)