重复命令小工具附带关键源代码

最近需要测试一个小程序的稳定性,具体表现为某个后台程序单次运行没问题,但是运行几千次之后会报错,因为调用此程序的项目程序较大,不方便测试,于是专门写了一个小程序,用于反复执行exe,测试其稳定性。

重复命令小工具附带关键源代码_第1张图片

基本的【命令】,支持 exe,bat等可执行文件拖拽,【参数】可选,【环境】为需要添加的环境变量,【次数】为需要执行的次数。

关键代码如下:

//author:autumoon
//日期:2022-12-06 
	CString strCmd, strPara, strEnvDir;

	GetDlgItemText(IDC_EDIT_CMD, strCmd);
	GetDlgItemText(IDC_EDIT_PARA, strPara);
	GetDlgItemText(IDC_EDIT_ENVDIR, strEnvDir);

	bool bOutputIndex = ((CButton*)GetDlgItem(IDC_CHECK_OUTPUTINDEX))->GetCheck() == TRUE;
	bool bOutputErrOnly = ((CButton*)GetDlgItem(IDC_CHECK_OUTPUTERRONLY))->GetCheck() == TRUE;

	int nCount = GetDlgItemInt(IDC_EDIT_COUNT);

	if (strCmd.GetLength() == 0)
	{
		MessageBox(_T("提示"), _T("命令为空"), MB_ICONWARNING);
		return;
	}

	if (nCount <= 0)
	{
		MessageBox(_T("提示"), _T("次数不合法"), MB_ICONWARNING);
		return;
	}

	m_pProgressTotal.SetRange32(0, nCount);
	m_pProgressTotal.SetPos(0);

	_tstring stCmd = CMfcStrFile::CString2string(strCmd);
	_tstring stPara = CMfcStrFile::CString2string(strPara);
	_tstring stEnvDir = CMfcStrFile::CString2string(strEnvDir);
	_tstring stCmdPara = stCmd;

	if (stPara.length())
	{
		stCmdPara += _T(" ") + stPara;
	}

	std::string sEnvDir = CStdStr::ws2s(stEnvDir);
	std::string sCmdPara = CStdStr::ws2s(stCmdPara);

	//添加环境变量
	if (stEnvDir.length() && AddEnvPathIfNotExist(sEnvDir.c_str()) < 0)
	{
		m_reOutput.SetSel(-1, -1);
		m_reOutput.ReplaceSel(_T("环境变量添加失败!"));
		m_reOutput.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
	}

	m_reOutput.Clear();

	for (int i = 0; i < nCount; ++i)
	{
		std::string sReturn;
		int nRet = ExeCmd(sCmdPara, sReturn);

		if (!bOutputErrOnly || bOutputErrOnly && nRet < 0)
		{
			if (bOutputIndex)
			{
				CString strIndex;
				strIndex.Format(_T("\n当前正在执行 %d 次:"), i + 1);
				m_reOutput.ReplaceSel((LPCTSTR)strIndex.GetBuffer(0));
			}

			m_reOutput.ReplaceSel((LPCTSTR)CString(sReturn.c_str()).GetBuffer(0));

			m_reOutput.SetSel(-1, -1);

			GetDlgItem(IDC_RICHEDIT2_OUTPUT)->SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
		}

		//主线程执行
		MSG msg;
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		CString strCurPos;
		strCurPos.Format(_T("当前进度:%d / %d"), i + 1, nCount);
		GetDlgItem(IDC_STATIC_PROGRESS)->SetWindowText(strCurPos);
		m_pProgressTotal.SetPos(i + 1);
	}

	MessageBox(_T("命令执行完成!"), _T("提示"));

欢迎交流与讨论,有需要的同学可以与我取得联系。

你可能感兴趣的:(c++,MFC,mfc,windows)