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
00075
00076 _TimerID() : iTimerID(0),
00077 iIndex(0),
00078 iMS(0)
00079 {
00080 }
00081 } TimerID;
00082 public:
00083
00084 void SetCleanTimeout(DWORD dwTimeout);
00085
00086
00087 BOOL IsInitialized()const;
00088
00089
00090 unsigned long GetNumberOfThreads()const;
00091
00092
00093 const std::string& GetClassName()const;
00094
00095
00096 BOOL ReSetTimeout(const TimerID& rTimerID);
00097
00098
00099
00100
00101 BOOL RemoveTimeout(TimerID& aTimerID,
00102 BOOL bInvokeDeleteProc=FALSE);
00103
00104
00105
00106
00107
00108
00109
00110
00111 TimerID RegisterTimeout(int iMS,
00112 LPTimeoutProc pProc,
00113 LPVOID pData,
00114 BOOL bClearTimeout=FALSE,
00115 HWND hHandle=NULL,
00116 TimerID* pTimer=NULL,
00117 LPTimeoutProc pDeleteProc=NULL);
00118
00119
00120 void DecreaseSocketCount(HWND hWindowHandle,
00121 BOOL bFreeze=FALSE);
00122
00123
00124 void DecreaseTimeoutCount(HWND hWindowHandle,
00125 BOOL bFreeze=FALSE);
00126
00127
00128 HWND GetWindowHandle(BOOL bTimeout=FALSE);
00129
00130
00131 const CGenericThread* GetThreadByHWND(HWND hWindowHandle)const;
00132
00133
00134 BOOL Initialize(unsigned long ulThreadCount,
00135 LPCSTR lpClassName);
00136
00137
00138 BOOL Uninitialize();
00139
00140
00141 CSocketThreadManager(HINSTANCE hInstance);
00142 virtual ~CSocketThreadManager();
00143 protected:
00144
00145 typedef struct _ThreadDataExtend
00146 {
00147 LPVOID lpData;
00148 _ThreadDataExtend* pNext;
00149
00150
00151 _ThreadDataExtend() : lpData(NULL),
00152 pNext(NULL)
00153 {
00154 }
00155 } ThreadDataExtend;
00156
00157
00158 typedef struct _TimeoutData
00159 {
00160 LPTimeoutProc pTimeoutProc;
00161 LPVOID pData;
00162 BOOL bClearTimeout;
00163 TimerID* pTimer;
00164 LPTimeoutProc pDeleteProc;
00165 } TimeoutData;
00166
00167
00168 typedef std::map<unsigned int,TimeoutData> TOMap;
00169
00170
00171 typedef struct _ThreadData
00172 {
00173 HWND hWindowHandle;
00174 int iSocketCount;
00175 int iTimeoutCount;
00176 BOOL bFreeze;
00177 CGenericThread* pThread;
00178 HINSTANCE hInstance;
00179 CGenericEvent* pEvent;
00180 TOMap pMap;
00181 std::string sClassName;
00182 CGenericCriticalSection* pCSection;
00183 CSocketThreadManager* pClass;
00184 ThreadDataExtend aExtension;
00185 } ThreadData;
00186 protected:
00187
00188 virtual void ParseDispatchMessage(const MSG& rMsg,
00189 ThreadData* pData);
00190
00191
00192 virtual void CreateExtendedData(ThreadDataExtend& rData);
00193
00194
00195 virtual void DeleteExtendedData(ThreadDataExtend& rData);
00196
00197
00198 ThreadData* GetDataByHWND(HWND hHandle)const;
00199 private:
00200
00201 CSocketThreadManager(BOOL bStatic);
00202 private:
00203
00204 CSocketThreadManager(const CSocketThreadManager& rManager);
00205
00206
00207 CSocketThreadManager& operator=(const CSocketThreadManager& rManager);
00208
00209
00210 BOOL RegisterClass(LPCSTR lpClassName);
00211
00212
00213 BOOL UnregisterClass();
00214
00215
00216 void CleanThreads(BOOL bError);
00217
00218
00219 int GetIndexByHWND(HWND hHandle)const;
00220
00221
00222 int GetMostAvailableThread()const;
00223
00224
00225 static DWORD SocketThread(LPVOID lpParameter);
00226
00227
00228 BOOL SpawnThreads(LPCSTR lpClassName);
00229
00230
00231 unsigned long m_ulThreadCount;
00232
00233
00234 ThreadData* m_pThreadData;
00235
00236
00237 HINSTANCE m_hInstance;
00238
00239
00240 CGenericCriticalSection* m_pCSection;
00241
00242
00243 static BOOL m_bRegisteredWindow;
00244
00245
00246 static CSocketThreadManager m_sManager;
00247
00248
00249 BOOL m_bStaticClass;
00250
00251
00252 std::string m_sClassName;
00253
00254
00255 BOOL m_bInitialized;
00256
00257
00258 DWORD m_dwCleanTimeout;
00259 };
00260
00261 KOMODIA_NAMESPACE_END
00262
00263 #endif // !defined(AFX_SOCKETTHREADMANAGER_H__74FE76EA_CB87_4F58_8F81_AA23A971A332__INCLUDED_)