诸暨麻将添加redis
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

375 рядки
10 KiB

  1. #include "StdAfx.h"
  2. #include "TraceService.h" // #include "EventService.h"
  3. #include "AsynchronismEngine.h"
  4. //////////////////////////////////////////////////////////////////////////
  5. //宏定义
  6. #define WM_ASYN_REQUEST WM_USER+10 //异步请求
  7. //////////////////////////////////////////////////////////////////////////
  8. BEGIN_MESSAGE_MAP(CControlWnd, CWnd)
  9. ON_MESSAGE(WM_ASYN_REQUEST, OnAsynRequest)
  10. END_MESSAGE_MAP()
  11. //////////////////////////////////////////////////////////////////////////
  12. //构造函数
  13. CControlWnd::CControlWnd()
  14. {
  15. m_pAsynchronismEngine = NULL;
  16. }
  17. //析构函数
  18. CControlWnd::~CControlWnd()
  19. {
  20. }
  21. //请求消息
  22. HRESULT CControlWnd::OnAsynRequest(WPARAM wParam, LPARAM lParam)
  23. {
  24. //效验变量
  25. ASSERT(m_pAsynchronismEngine != NULL);
  26. //获取参数
  27. WORD wRequestID = (WORD)wParam;
  28. IAsynchronismEngineSink * pIAsynchronismEngineSink = (IAsynchronismEngineSink *)lParam;
  29. //请求处理
  30. ASSERT(pIAsynchronismEngineSink != NULL);
  31. m_pAsynchronismEngine->OnAsynchronismRequest(wRequestID, pIAsynchronismEngineSink);
  32. return 0;
  33. }
  34. //////////////////////////////////////////////////////////////////////////
  35. //构造函数
  36. CMessageThread::CMessageThread()
  37. {
  38. m_pAsynchronismEngine = NULL;
  39. }
  40. //析构函数
  41. CMessageThread::~CMessageThread()
  42. {
  43. }
  44. //运行函数
  45. bool CMessageThread::OnEventThreadRun()
  46. {
  47. MSG Message;
  48. if (GetMessage(&Message, NULL, 0, 0))
  49. {
  50. TranslateMessage(&Message);
  51. DispatchMessage(&Message);
  52. return true;
  53. }
  54. return false;
  55. }
  56. //停止线程
  57. bool CMessageThread::StopThread(DWORD dwWaitSeconds)
  58. {
  59. PostThreadMessage(WM_QUIT, 0, 0);
  60. return __super::ConcludeThread(dwWaitSeconds);
  61. }
  62. //中止线程
  63. bool CMessageThread::TerminateThread(DWORD dwExitCode)
  64. {
  65. PostThreadMessage(WM_QUIT, 0, 0);
  66. return __super::ConcludeThread(INFINITE);
  67. }
  68. //开始事件
  69. bool CMessageThread::OnThreadStratEvent()
  70. {
  71. ASSERT(m_pAsynchronismEngine != NULL);
  72. return m_pAsynchronismEngine->OnMessageThreadStart();
  73. }
  74. //停止事件
  75. bool CMessageThread::OnThreadStopEvent()
  76. {
  77. ASSERT(m_pAsynchronismEngine != NULL);
  78. return m_pAsynchronismEngine->OnMessageThreadStop();
  79. }
  80. //////////////////////////////////////////////////////////////////////////
  81. //构造函数
  82. CAsynchronismEngine::CAsynchronismEngine(void)
  83. {
  84. //设置变量
  85. m_bService = false;
  86. memset(m_cbBuffer, 0, sizeof(m_cbBuffer));
  87. //设置组件
  88. m_ControlWnd.m_pAsynchronismEngine = this;
  89. m_MessageThread.m_pAsynchronismEngine = this;
  90. return;
  91. }
  92. //析构函数
  93. CAsynchronismEngine::~CAsynchronismEngine(void)
  94. {
  95. }
  96. //接口查询
  97. void * CAsynchronismEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
  98. {
  99. QUERYINTERFACE(IAsynchronismEngine, Guid, dwQueryVer);
  100. QUERYINTERFACE_IUNKNOWNEX(IAsynchronismEngine, Guid, dwQueryVer);
  101. return NULL;
  102. }
  103. //启动服务
  104. bool CAsynchronismEngine::StartService()
  105. {
  106. //启动线程
  107. if (m_MessageThread.StartThread() == false) return false;
  108. //设置变量
  109. m_bService = true;
  110. return true;
  111. }
  112. //停止服务
  113. bool CAsynchronismEngine::ConcludeService()
  114. {
  115. //设置变量
  116. m_bService = false;
  117. //停止线程
  118. m_MessageThread.ConcludeThread(INFINITE);
  119. //清理数据
  120. m_DataStorage.RemoveData(false);
  121. return true;
  122. }
  123. //插入请求
  124. bool CAsynchronismEngine::InsertRequest(WORD wRequestID, void * const pBuffer, WORD wDataSize, IUnknownEx * pIUnknownEx)
  125. {
  126. //效验状态
  127. ASSERT(wDataSize <= sizeof(m_cbBuffer));
  128. if (m_bService == false) return false;
  129. if (wDataSize > sizeof(m_cbBuffer)) return false;
  130. //查询接口
  131. IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
  132. ASSERT(pIAsynchronismEngineSink != NULL);
  133. if (pIAsynchronismEngineSink == NULL) return false;
  134. //插入数据
  135. CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock);
  136. if (m_DataStorage.InsertData(wRequestID, pBuffer, wDataSize) == false) return false;
  137. //投递消息
  138. PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, wRequestID, (LPARAM)pIAsynchronismEngineSink);
  139. return true;
  140. }
  141. bool CAsynchronismEngine::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
  142. {
  143. CWHDataLocker lock(m_CriticalSection);//
  144. m_DataStorage.GetBurthenInfo(BurthenInfo);
  145. return true;
  146. }
  147. //注册钩子
  148. bool CAsynchronismEngine::SetAsynchronismSink(IUnknownEx * pIUnknownEx)
  149. {
  150. //获取接口
  151. IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
  152. ASSERT(pIAsynchronismEngineSink != NULL);
  153. if (pIAsynchronismEngineSink == NULL) return false;
  154. //查找现存
  155. IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL;
  156. for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
  157. {
  158. pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[0];
  159. ASSERT(pIAsynchronismEngineSinkTemp != NULL);
  160. if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink) return false;
  161. }
  162. //注册钩子
  163. m_AsynchronismEngineSinkArray.Add(pIAsynchronismEngineSink);
  164. return true;
  165. }
  166. //投递数据
  167. bool CAsynchronismEngine::PostAsynchronismData(WORD wIdentifier, VOID * pData, WORD wDataSize)
  168. {
  169. //效验状态
  170. ASSERT(wDataSize <= sizeof(m_cbBuffer));
  171. if (m_bService == false) return false;
  172. if (wDataSize > sizeof(m_cbBuffer)) return false;
  173. // //查询接口
  174. // IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_ME_INTERFACE(IAsynchronismEngineSink);
  175. // ASSERT(pIAsynchronismEngineSink != NULL);
  176. // if (pIAsynchronismEngineSink == NULL) return false;
  177. //插入数据
  178. CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock);
  179. if (m_DataStorage.InsertData(wIdentifier, pData, wDataSize) == false) return false;
  180. //投递消息
  181. PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, (WPARAM)pData, /*(LPARAM)pIAsynchronismEngineSink*/0);
  182. return true;
  183. }
  184. bool CAsynchronismEngine::PostAsynchronismData(WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount)
  185. {
  186. //效验状态
  187. // ASSERT(wDataSize <= sizeof(m_cbBuffer));
  188. if (m_bService == false) return false;
  189. // //查询接口
  190. // IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_ME_INTERFACE(IAsynchronismEngineSink);
  191. // ASSERT(pIAsynchronismEngineSink != NULL);
  192. // if (pIAsynchronismEngineSink == NULL) return false;
  193. //插入数据
  194. CWHDataLocker lcok(m_CriticalSection); // CThreadLockHandle ThreadLockHandle(&m_ThreadLock);
  195. for (WORD i = 0; i < wDataCount; i++)
  196. {
  197. if (m_DataStorage.InsertData(wIdentifier, DataBuffer[i].pDataBuffer, DataBuffer[i].wDataSize) == false) return false;
  198. //投递消息
  199. PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, (WPARAM)DataBuffer[i].pDataBuffer, /*(LPARAM)pIAsynchronismEngineSink*/0);
  200. }
  201. return true;
  202. }
  203. //取消注册
  204. bool CAsynchronismEngine::UnRegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx)
  205. {
  206. //获取接口
  207. IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
  208. ASSERT(pIAsynchronismEngineSink != NULL);
  209. if (pIAsynchronismEngineSink == NULL) return false;
  210. //删除钩子
  211. IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL;
  212. for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
  213. {
  214. pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[0];
  215. ASSERT(pIAsynchronismEngineSinkTemp != NULL);
  216. if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink)
  217. {
  218. m_AsynchronismEngineSinkArray.RemoveAt(i);
  219. return true;
  220. }
  221. }
  222. return false;
  223. }
  224. //线程启动
  225. bool CAsynchronismEngine::OnMessageThreadStart()
  226. {
  227. //创建窗口
  228. if (m_ControlWnd.m_hWnd == NULL)
  229. m_ControlWnd.Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), CWnd::GetDesktopWindow(), 10);
  230. //事件通知
  231. bool bSuccsee = true;
  232. IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL;
  233. for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
  234. {
  235. pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[0];
  236. ASSERT(pIAsynchronismEngineSink != NULL);
  237. try
  238. {
  239. if (pIAsynchronismEngineSink->OnAsynchronismEngineStart() == false) bSuccsee = false;
  240. }
  241. catch (...)
  242. {
  243. bSuccsee = false;
  244. }
  245. }
  246. return bSuccsee;
  247. }
  248. //线程停止
  249. bool CAsynchronismEngine::OnMessageThreadStop()
  250. {
  251. //关闭窗口
  252. m_ControlWnd.DestroyWindow();
  253. //事件通知
  254. bool bSuccsee = true;
  255. IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL;
  256. for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
  257. {
  258. pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[0];
  259. ASSERT(pIAsynchronismEngineSink != NULL);
  260. try
  261. {
  262. if (pIAsynchronismEngineSink->OnAsynchronismEngineConclude() == false) bSuccsee = false;
  263. }
  264. catch (...)
  265. {
  266. bSuccsee = false;
  267. }
  268. }
  269. return bSuccsee;
  270. }
  271. //异步请求
  272. void CAsynchronismEngine::OnAsynchronismRequest(WORD wRequestID, IAsynchronismEngineSink * pIAsynchronismEngineSink)
  273. {
  274. //锁定资源
  275. CWHDataLocker lcok(m_CriticalSection);
  276. //提取数据
  277. tagDataHead DataHead;
  278. m_DataStorage.DistillData(DataHead, m_cbBuffer, sizeof(m_cbBuffer));
  279. //消息处理
  280. try
  281. {
  282. ASSERT(DataHead.wIdentifier == wRequestID);
  283. pIAsynchronismEngineSink->OnAsynchronismEngineData(wRequestID, m_cbBuffer, DataHead.wDataSize);
  284. }
  285. catch (...) {}
  286. return;
  287. }
  288. //////////////////////////////////////////////////////////////////////////
  289. //建立对象函数
  290. extern "C" __declspec(dllexport) void * CreateAsynchronismEngine(const GUID & Guid, DWORD dwInterfaceVer)
  291. {
  292. //建立对象
  293. CAsynchronismEngine * pAsynchronismEngine = NULL;
  294. try
  295. {
  296. pAsynchronismEngine = new CAsynchronismEngine();
  297. if (pAsynchronismEngine == NULL) throw TEXT("创建失败");
  298. void * pObject = pAsynchronismEngine->QueryInterface(Guid, dwInterfaceVer);
  299. if (pObject == NULL) throw TEXT("接口查询失败");
  300. return pObject;
  301. }
  302. catch (...) {}
  303. //清理对象
  304. SafeDelete(pAsynchronismEngine);
  305. return NULL;
  306. }
  307. //////////////////////////////////////////////////////////////////////////