Thread.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "stdafx.h"
  2. #include <process.h>
  3. #include "Thread.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. unsigned int WINAPI ThreadProc(IN LPVOID lpParam);
  10. CThreadBase::CThreadBase()
  11. {
  12. m_hThread = NULL;
  13. m_ThreadStatus = THREADSTATUS_STOP;
  14. m_nThreadID = 0;
  15. m_dwOutTime = INFINITE;
  16. }
  17. CThreadBase::~CThreadBase()
  18. {
  19. }
  20. /************************************************************************/
  21. /*
  22. 函数:Start
  23. 描述:启动线程
  24. 参数:
  25. 返回:1成功, 0失败
  26. */
  27. /************************************************************************/
  28. int CThreadBase::Start()
  29. {
  30. if(m_ThreadStatus != THREADSTATUS_STOP)
  31. return 1;
  32. if(m_hThread == NULL)
  33. m_hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, this, 0, &m_nThreadID);
  34. if(m_hThread == 0)
  35. {
  36. #ifdef _DEBUG
  37. CString strError = _T("");
  38. strError.Format(_T("创建线程失败:%d\n"), ::GetLastError());
  39. OutputDebugString(strError);
  40. #endif //#ifdef _DEBUG
  41. return 0;
  42. }
  43. m_ThreadStatus = THREADSTATUS_WAIT;
  44. return 1;
  45. }
  46. /************************************************************************/
  47. /*
  48. 函数:Exit
  49. 描述:线程退出
  50. 参数:
  51. 返回:
  52. */
  53. /************************************************************************/
  54. void CThreadBase::Exit()
  55. {
  56. if(m_hThread)
  57. {
  58. if(WaitForSingleObject(m_hThread, m_dwOutTime) == WAIT_TIMEOUT)
  59. Terminate();
  60. CloseHandle(m_hThread);
  61. }
  62. m_hThread = NULL;
  63. m_ThreadStatus = THREADSTATUS_EXIT;
  64. }
  65. /************************************************************************/
  66. /*
  67. 函数:Terminate
  68. 描述:终止
  69. 参数:
  70. 返回:
  71. */
  72. /************************************************************************/
  73. void CThreadBase::Terminate()
  74. {
  75. ::TerminateThread(m_hThread, 1);
  76. }
  77. /************************************************************************/
  78. /*
  79. 函数:Suspend
  80. 描述:挂起
  81. 参数:
  82. 返回:1成功,0失败
  83. */
  84. /************************************************************************/
  85. void CThreadBase::Suspend()
  86. {
  87. ::SuspendThread(m_hThread);
  88. m_ThreadStatus = THREADSTATUS_STOP;
  89. }
  90. /************************************************************************/
  91. /*
  92. 函数:ResumeThread
  93. 描述:唤醒
  94. 参数:
  95. 返回:1成功,0失败
  96. */
  97. /************************************************************************/
  98. void CThreadBase::Resume()
  99. {
  100. ::ResumeThread(m_hThread);
  101. m_ThreadStatus = THREADSTATUS_RUNNING;
  102. }
  103. /************************************************************************/
  104. /*
  105. 函数:WorkItem
  106. 描述:工作项
  107. 参数:
  108. IN LPVOID lpParam
  109. 返回:0
  110. */
  111. /************************************************************************/
  112. unsigned int WINAPI ThreadProc(IN LPVOID lpParam)
  113. {
  114. CThreadBase* p = (CThreadBase*)lpParam;
  115. int nSatus = 0;
  116. while(1)
  117. {
  118. int nSatus = p->Run();
  119. if(nSatus == THREADSTATUS_EXIT) // 程序结束
  120. break;
  121. }
  122. return 0;
  123. }