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