ScriptExecutor.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef __SCRIPT_EXECUTOR__
  2. #define __SCRIPT_EXECUTOR__
  3. #pragma once
  4. #define BUFSIZE 4096
  5. enum PY_RUN_TYPE
  6. {
  7. EMBEDDED, // 嵌入到本进程运行;
  8. SUBPROCESS // 以子进程方式运行;
  9. };
  10. class CScriptExecutor
  11. {
  12. public:
  13. CScriptExecutor(void);
  14. ~CScriptExecutor(void);
  15. protected:
  16. SATHTTP::STCase *m_pCaseObj; // 用例对象;
  17. HANDLE m_hWorkThread; // 事件句柄;
  18. HANDLE m_hStdoutLogThread; // 事件句柄;
  19. BOOL m_bStatus; // 线程状态;
  20. TCHAR m_szScriptPath[MAX_PATH]; // 脚本路径;
  21. TCHAR m_szLogPath[MAX_PATH]; // 日志路径;
  22. TCHAR m_szExtraSentence[MAX_PATH]; // 脚本命令行参数或额外要执行的语句;
  23. int m_nRunType;
  24. // 重定向标准输出和标准错误;
  25. HANDLE m_hStdOutRead;
  26. HANDLE m_hStdOutWrite;
  27. HANDLE m_hStdErrorRead;
  28. HANDLE m_hStdErrorWrite;
  29. HANDLE m_hOldStdOutWrite; // 用于本进程标准输出备份;
  30. // 子进程信息;
  31. STARTUPINFO m_si;
  32. PROCESS_INFORMATION m_pi;
  33. // 进程结束标志;
  34. BOOL m_bKillProcess;
  35. // 停止日志导出线程;
  36. BOOL m_bStopLogExport;
  37. // 执行器执行时间;
  38. CTime m_tStartTime;
  39. ULONGLONG m_ulStartTickCount;
  40. // 执行器结束时间;
  41. CTime m_tEndTime;
  42. // 子进程ID;
  43. DWORD m_dwSubprocessId;
  44. // 线程ID;
  45. DWORD m_dwThreadId;
  46. // 脚本是否成功运行;
  47. BOOL m_bRuned;
  48. protected:
  49. // 工作者线程函数;
  50. static DWORD WINAPI _WorkerThread(LPVOID lpParam);
  51. // 日志导出线程;
  52. static DWORD WINAPI _StdoutLogExportThread(LPVOID lpParam);
  53. static DWORD WINAPI _StderrLogExportThread(LPVOID lpParam);
  54. // 重定向本进程标准输出;
  55. int RedirectProcessStdout();
  56. // 重定子进程向标准输出;
  57. int RedirectSubprocessStdout(LPSTARTUPINFO si = NULL);
  58. // 获取Python异常;
  59. void CatchPythonException();
  60. // 运行嵌入的脚本;
  61. int RunEmbeddedScript();
  62. // 运行脚本进程;
  63. int RunScriptProcess();
  64. // 在服务进程中创建脚本进程;
  65. int ServiceRunScriptProcess();
  66. // 开启线程;
  67. bool StartThread();
  68. // 结束线程;
  69. void EndWorkThread();
  70. void EndLogThread();
  71. void EndThread();
  72. // 从管道读取日志;
  73. void ReadFromPipe();
  74. // 结束重定向句柄,恢复默认;
  75. void EndProcessStdOut();
  76. void EndSubprocessStdOut();
  77. // 获取当前活动的会话ID;
  78. DWORD GetActiveSessionID();
  79. // 在服务进程下创建子进程;
  80. BOOL ServiceExecute(std::wstring wstrCmdLine, INT32& n32ExitResult);
  81. public:
  82. // 初始脚本运行参数;
  83. bool InitScript(
  84. std::string strScript,
  85. std::string strLogPath,
  86. std::string strScriptCmd,
  87. int nRunType = EMBEDDED);
  88. // 运行脚本;
  89. bool StartScript();
  90. // 停止脚本;
  91. void StopScript();
  92. // 脚本是否结束;
  93. bool IsScriptOver();
  94. // 运行类型;
  95. int GetRunType() const { return m_nRunType;}
  96. // 获取脚本Id;
  97. DWORD GetScriptId() const {
  98. if ( m_nRunType == SUBPROCESS )
  99. return m_dwSubprocessId;
  100. else
  101. return m_dwThreadId;
  102. }
  103. // 设置用例对象;
  104. void SetCaseObje(SATHTTP::STCase *pObj){ m_pCaseObj = pObj;}
  105. // 结束子进程;
  106. BOOL EndSubprocess();
  107. // 获取活动的CPU时间;
  108. ULONGLONG GetActiveTickCount() const { return m_ulStartTickCount;}
  109. };
  110. #endif // __SCRIPT_EXECUTOR__