CRunner.cpp
上传用户:bkierde
上传日期:2022-06-07
资源大小:1840k
文件大小:2k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* -------------------------------------------------------------------------
  2. // 文件名 : Race/CRunner.cpp
  3. // 创建者 : 朱洪波
  4. // 创建时间 : 2007-10-15 13:51:58
  5. // 功能描述 :
  6. //
  7. // -----------------------------------------------------------------------*/
  8. #include "stdafx.h"
  9. #include "CRunner.h"
  10. // -------------------------------------------------------------------------
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. // -------------------------------------------------------------------------
  17. //赛跑的总长度为100米
  18. int CRunner::lenght=100;
  19. //构造函数
  20. CRunner::CRunner()
  21. {
  22. memset(&m_stVar,0,sizeof(StThreadVar));
  23. m_pThread=0;
  24. }
  25. //析构函数
  26. CRunner::~CRunner()
  27. {
  28. }
  29. void CRunner::start(StThreadVar& st)
  30. {
  31. if(!m_pThread)
  32. {
  33. memcpy(&m_stVar,&st,sizeof(StThreadVar));
  34. //传递this指针作为线程的执行参数
  35. m_pThread=::AfxBeginThread(CRunner::thread_main,this);
  36. }
  37. }
  38. UINT CRunner::thread_main(LPVOID ptr)
  39. {
  40. //安全性检查
  41. if(ptr)
  42. {
  43. //调用成员函数作为线程的执行体
  44. CRunner* runner=(CRunner*)ptr;
  45. runner->run();
  46. }
  47. return 0;
  48. }
  49. void CRunner::run()
  50. {
  51. int iStep=0;
  52. BOOL start=FALSE;
  53. while (TRUE)
  54. {
  55. //等待发令枪,预备状态
  56. DWORD dr=::WaitForSingleObject(this->m_stVar.hTag,INFINITE);
  57. //枪响,开始赛跑
  58. dr=::WaitForSingleObject(this->m_stVar.hExit,0);
  59. if(dr==WAIT_TIMEOUT)
  60. {
  61. iStep++;
  62. //运动员还没有到终点
  63. if(iStep<=CRunner::lenght)
  64. {
  65. //发送消息表示自己的位置
  66. this->m_stVar.pWnd->SendMessage(WM_USER+1000,this->m_stVar.index,iStep);
  67. //一下代码为产生一个0-400的随机数字,决定线程的阻塞时间
  68. //由此决定了各个运动员的速度变化不一
  69. srand(GetTickCount());
  70. int i=rand()%400;
  71. Sleep(i);
  72. }
  73. //运动员到达终点
  74. else
  75. {
  76. this->m_stVar.pWnd->SendMessage(WM_USER+1001,0,0);
  77. return;
  78. }
  79. }
  80. //结束比赛信号发出,终止比赛
  81. else if (dr==WAIT_OBJECT_0)
  82. {
  83. return;
  84. }
  85. //意外处理
  86. else if(dr=WAIT_FAILED)
  87. {
  88. return;
  89. }
  90. else
  91. {
  92. return;
  93. }
  94. }
  95. }
  96. // -------------------------------------------------------------------------