ThreadFuncForMsg.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:3k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. extern HWND g_hStatusBar;
  3. extern SOCKET g_csock;
  4. extern CWHQueue g_xMsgQueue;
  5. extern CWHList<CSessionInfo*> g_xSessionList;
  6. DWORD WINAPI ThreadFuncForMsg(LPVOID lpParameter)
  7. {
  8. char szData[DATA_BUFSIZE];
  9. char szRemainData[DATA_BUFSIZE];
  10. char *pszData;
  11. char *pszFirst, *pszEnd;
  12. int nCount = 0, nDataPos = 0, nRemainDataLen = 0, nRemain = 0;
  13. int nLoop;
  14. int nSocket;
  15. FILETIME ftKernelTimeStart, ftKernelTimeEnd;
  16. FILETIME ftUserTimeStart, ftUserTimeEnd;
  17. FILETIME ftDummy, ftTotalTimeElapsed;
  18. __int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
  19. TCHAR wszThreadTime[32];
  20. WSABUF Buf;
  21. DWORD dwSendBytes = 0;
  22. while (TRUE)
  23. {
  24. GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeStart, &ftUserTimeStart);
  25. if (g_fTerminated)
  26. return 0;
  27. nCount = g_xMsgQueue.GetCount();
  28. nDataPos = 0;
  29. pszFirst = NULL;
  30. if (nCount)
  31. {
  32. if (nRemainDataLen)
  33. {
  34. memmove(szData, szRemainData, nRemainDataLen);
  35. nDataPos = nRemainDataLen;
  36. }
  37. for (nLoop = 0; nLoop < nCount; nLoop++)
  38. {
  39. pszData = (char *)g_xMsgQueue.PopQ();
  40. if (!pszData) continue;
  41. if (pszFirst)
  42. {
  43. nRemain = memlen(pszFirst);
  44. if (nRemain)
  45. {
  46. memmove(szData, pszFirst, nRemain);
  47. nDataPos = 0;
  48. }
  49. }
  50. else
  51. nDataPos = 0;
  52. memmove((szData + nDataPos), pszData, memlen(pszData));
  53. pszEnd = &szData[0];
  54. while (TRUE)
  55. {
  56. if ((pszFirst = (char *)memchr(pszEnd, '%', memlen(pszEnd))) && (pszEnd = (char *)memchr(pszFirst, '$', memlen(pszFirst))))
  57. {
  58. *pszEnd = '';
  59. if (*(pszFirst + 1) == '+')
  60. {
  61. if (*(pszFirst + 2) == '-')
  62. InsertLogMsg(_TEXT("Kick User."));
  63. else
  64. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(2, 0), (LPARAM)_TEXT("Activation")); // Received keep alive check code from login server 
  65. }
  66. else
  67. {
  68. if (pszEnd = strchr(pszFirst, '/'))
  69. {
  70. pszEnd++;
  71. if (nSocket = AnsiStrToVal(pszFirst + 1))
  72. {
  73. Buf.len = memlen(pszEnd) - 1;
  74. Buf.buf = pszEnd;
  75. WSASend((SOCKET)nSocket, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
  76. }
  77. }
  78. }
  79. }
  80. else
  81. break;
  82. } // while loop
  83. delete [] pszData;
  84. } // for loop
  85. if (pszFirst)
  86. {
  87. nRemain = memlen(pszFirst);
  88. if (nRemain)
  89. {
  90. memmove(szRemainData, pszFirst, nRemain);
  91. nRemainDataLen = nRemain;
  92. }
  93. else
  94. nRemainDataLen = 0;
  95. }
  96. } // if (nCount)
  97. GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeEnd, &ftUserTimeEnd);
  98. qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);
  99. qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) - FileTimeToQuadWord(&ftUserTimeStart);
  100. qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
  101. QuadTimeToFileTime(qwTotalTimeElapsed, &ftTotalTimeElapsed);
  102. wsprintf(wszThreadTime, _TEXT("%u%u ns"), ftTotalTimeElapsed.dwHighDateTime, ftTotalTimeElapsed.dwLowDateTime);
  103. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(4, 0), (LPARAM)wszThreadTime);
  104. SleepEx(1, TRUE);
  105. }
  106. return 0;
  107. }