소스 검색

Two-pass RunAndWait

Brian Fiete 9 달 전
부모
커밋
bf9272377d
3개의 변경된 파일50개의 추가작업 그리고 41개의 파일을 삭제
  1. 43 34
      BeefTools/RunAndWait/RunAndWait.cpp
  2. 7 7
      BeefTools/RunAndWait/RunAndWait.vcxproj
  3. BIN
      bin/RunAndWait.exe

+ 43 - 34
BeefTools/RunAndWait/RunAndWait.cpp

@@ -120,50 +120,59 @@ int main()
 	
 	
 	std::string cmdLine = useCmdLineStr;	
 	std::string cmdLine = useCmdLineStr;	
 	
 	
-	PROCESS_INFORMATION processInfo;
+	for (int pass = 0; pass < 2; pass++)
+	{
+		PROCESS_INFORMATION processInfo;
 
 
-	STARTUPINFOA si;
-	ZeroMemory(&si, sizeof(si));
-	si.cb = sizeof(si);
-	memset(&processInfo, 0, sizeof(processInfo));
+		STARTUPINFOA si;
+		ZeroMemory(&si, sizeof(si));
+		si.cb = sizeof(si);
+		memset(&processInfo, 0, sizeof(processInfo));
 
 
-	si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+		si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
 
 
- 	HANDLE stdOut;
- 	CreatePipe(stdOut, si.hStdOutput, false);
-	
-	HANDLE stdErr;
-	CreatePipe(stdErr, si.hStdError, false);	
+		HANDLE stdOut;
+		CreatePipe(stdOut, si.hStdOutput, false);
 
 
-	si.dwFlags = STARTF_USESTDHANDLES;
+		HANDLE stdErr;
+		CreatePipe(stdErr, si.hStdError, false);
 
 
-	DWORD startTick = GetTickCount();
-	BOOL worked = CreateProcessA(NULL, (char*)cmdLine.c_str(), NULL, NULL, TRUE,
-		flags, envPtr, NULL, &si, &processInfo);
+		si.dwFlags = STARTF_USESTDHANDLES;
 
 
-	::CloseHandle(si.hStdOutput);
-	::CloseHandle(si.hStdError);
+		DWORD startTick = GetTickCount();
+		BOOL worked = CreateProcessA(NULL, (char*)cmdLine.c_str(), NULL, NULL, TRUE,
+			flags, envPtr, NULL, &si, &processInfo);
 
 
-	if (!worked)
-		return 1;
+		::CloseHandle(si.hStdOutput);
+		::CloseHandle(si.hStdError);
 
 
-	DWORD threadId;
- 	ProcParams stdOutParams = { stdOut, GetStdHandle(STD_OUTPUT_HANDLE) };
- 	HANDLE stdOutThread = ::CreateThread(NULL, (SIZE_T)128*1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdOutParams, 0, &threadId);
+		if (!worked)
+			return 1;
 
 
-	ProcParams stdErrParams = { stdErr, GetStdHandle(STD_ERROR_HANDLE) };
-	HANDLE stdErrThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdErrParams, 0, &threadId);
+		DWORD threadId;
+		ProcParams stdOutParams = { stdOut, GetStdHandle(STD_OUTPUT_HANDLE) };
+		HANDLE stdOutThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdOutParams, 0, &threadId);
 
 
-	while (true)
-	{		
-		if (::WaitForSingleObject(processInfo.hProcess, 20) == WAIT_OBJECT_0)
-			break;
+		ProcParams stdErrParams = { stdErr, GetStdHandle(STD_ERROR_HANDLE) };
+		HANDLE stdErrThread = ::CreateThread(NULL, (SIZE_T)128 * 1024, (LPTHREAD_START_ROUTINE)ReadProc, (void*)&stdErrParams, 0, &threadId);
+
+		while (true)
+		{
+			if (::WaitForSingleObject(processInfo.hProcess, 20) == WAIT_OBJECT_0)
+				break;
+		}
+		::WaitForSingleObject(stdOutThread, INFINITE);
+		::WaitForSingleObject(stdErrThread, INFINITE);
+
+		DWORD exitCode = 0;
+		::GetExitCodeProcess(processInfo.hProcess, &exitCode);
+
+		printf("Exit code: %d\n", exitCode);
+		if ((exitCode == 0) || (pass == 1))
+			return exitCode;
+		
+		printf("FAILED! Starting second attempt.\n");
 	}
 	}
-	::WaitForSingleObject(stdOutThread, INFINITE);
-	::WaitForSingleObject(stdErrThread, INFINITE);
 
 
-	DWORD exitCode = 0;
-	::GetExitCodeProcess(processInfo.hProcess, &exitCode);	
-	
-	return exitCode;
+	return 0;
 }
 }

+ 7 - 7
BeefTools/RunAndWait/RunAndWait.vcxproj

@@ -23,32 +23,32 @@
     <ProjectGuid>{BE0C7160-375C-4164-8388-BFCC6DAA7828}</ProjectGuid>
     <ProjectGuid>{BE0C7160-375C-4164-8388-BFCC6DAA7828}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
     <Keyword>Win32Proj</Keyword>
     <RootNamespace>RunAndWait</RootNamespace>
     <RootNamespace>RunAndWait</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
   </PropertyGroup>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>Unicode</CharacterSet>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>Unicode</CharacterSet>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <CharacterSet>Unicode</CharacterSet>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v141</PlatformToolset>
+    <PlatformToolset>v143</PlatformToolset>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>Unicode</CharacterSet>
     <CharacterSet>Unicode</CharacterSet>
   </PropertyGroup>
   </PropertyGroup>
@@ -151,9 +151,9 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <GenerateDebugInformation>true</GenerateDebugInformation>
     </Link>
     </Link>
   </ItemDefinitionGroup>
   </ItemDefinitionGroup>
-  <ItemGroup>    
+  <ItemGroup>
   </ItemGroup>
   </ItemGroup>
-  <ItemGroup>    
+  <ItemGroup>
     <ClCompile Include="RunAndWait.cpp" />
     <ClCompile Include="RunAndWait.cpp" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

BIN
bin/RunAndWait.exe