PythonExecutor.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #ifndef __SCRIPT_EXECUTOR__
  2. #define __SCRIPT_EXECUTOR__
  3. #pragma once
  4. #define BUFSIZE 4096
  5. class CPythonExecutor
  6. {
  7. public:
  8. CPythonExecutor(void);
  9. ~CPythonExecutor(void);
  10. protected:
  11. SATHTTP::STCase *m_pCaseObj; // 用例对象;
  12. HANDLE m_hWorkThread; // 线程句柄;
  13. HANDLE m_hStdoutLogThread; // 线程句柄;
  14. HANDLE m_hStderrLogThread; // 线程句柄;
  15. TCHAR m_szScriptPath[MAX_PATH]; // 脚本路径;
  16. TCHAR m_szLogPath[MAX_PATH]; // 日志路径;
  17. TCHAR m_szExtraSentence[MAX_PATH]; // 脚本命令行参数或额外要执行的语句;
  18. // 重定向标准输出和标准错误;
  19. HANDLE m_hStdOutRead;
  20. HANDLE m_hStdOutWrite;
  21. HANDLE m_hStdErrorRead;
  22. HANDLE m_hStdErrorWrite;
  23. // 子进程信息;
  24. STARTUPINFO m_si;
  25. PROCESS_INFORMATION m_pi;
  26. // 停止日志导出线程;
  27. BOOL m_bStopLogExport;
  28. // 执行器执行时间;
  29. ULONGLONG m_ulStartTickCount;
  30. protected:
  31. // 工作者线程函数;
  32. static DWORD WINAPI _WorkerThread(LPVOID lpParam);
  33. // 日志导出线程;
  34. static DWORD WINAPI _StdoutLogExportThread(LPVOID lpParam);
  35. static DWORD WINAPI _StderrLogExportThread(LPVOID lpParam);
  36. // 重定子进程向标准输出;
  37. int RedirectSubprocessStdout(LPSTARTUPINFO si = NULL);
  38. // 运行脚本进程;
  39. int RunScriptProcess();
  40. // 在服务进程中创建脚本进程;
  41. int ServiceRunScriptProcess();
  42. // 开启线程;
  43. bool StartThread();
  44. // 结束线程;
  45. void EndWorkThread();
  46. void EndLogThread();
  47. void EndThread();
  48. // 从管道读取日志;
  49. void ReadFromPipe();
  50. // 结束重定向句柄,恢复默认;
  51. void EndSubprocessStdOut();
  52. // 获取当前活动的会话ID;
  53. DWORD GetActiveSessionID();
  54. public:
  55. // 初始脚本运行参数;
  56. bool InitScript(
  57. std::string strScript,
  58. std::string strLogPath,
  59. std::string strScriptCmd);
  60. // 运行脚本;
  61. bool StartScript();
  62. // 停止脚本;
  63. void StopScript();
  64. // 脚本是否结束;
  65. bool IsScriptOver();
  66. // 设置用例对象;
  67. void SetCaseObje(SATHTTP::STCase *pObj){ m_pCaseObj = pObj;}
  68. // 结束子进程;
  69. BOOL EndSubprocess();
  70. // 获取活动的CPU时间;
  71. ULONGLONG GetActiveTickCount() const { return m_ulStartTickCount;}
  72. };
  73. #endif // __SCRIPT_EXECUTOR__