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