public AddProcess ( |
||
processHandle | ||
Результат | bool |
public static List <string> CallCompiler(string compiler, string args, out long CompileTimeMs) { Stopwatch watch = new Stopwatch(); using (Process process = new Process()) using (var job = new Job()) { process.StartInfo.FileName = compiler; process.StartInfo.Arguments = args; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); watch.Start(); job.AddProcess(process.Handle); OutputReader output = new OutputReader(process.StandardOutput); Thread outputReader = new Thread(new ThreadStart(output.ReadOutput)); outputReader.Start(); OutputReader error = new OutputReader(process.StandardError); Thread errorReader = new Thread(new ThreadStart(error.ReadOutput)); errorReader.Start(); process.WaitForExit(30000); bool is_killed = false; if (!process.HasExited) { process.Kill(); is_killed = true; } watch.Stop(); CompileTimeMs = watch.ElapsedMilliseconds; errorReader.Join(5000); outputReader.Join(5000); List <string> compOutput = new List <string>(); compOutput.Add(output.Output); if (is_killed) { error.Output = "Compilation terminated after 30 seconds. " + Environment.NewLine + error.Output; } compOutput.Add(error.Output); return(compOutput); } }
public static List<string> CallCompiler(string compiler, string args, out long CompileTimeMs) { Stopwatch watch = new Stopwatch(); using (Process process = new Process()) using (var job = new Job()) { process.StartInfo.FileName = compiler; process.StartInfo.Arguments = args; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; process.Start(); watch.Start(); job.AddProcess(process.Handle); OutputReader output = new OutputReader(process.StandardOutput); Thread outputReader = new Thread(new ThreadStart(output.ReadOutput)); outputReader.Start(); OutputReader error = new OutputReader(process.StandardError); Thread errorReader = new Thread(new ThreadStart(error.ReadOutput)); errorReader.Start(); process.WaitForExit(30000); bool is_killed = false; if (!process.HasExited) { process.Kill(); is_killed = true; } watch.Stop(); CompileTimeMs = watch.ElapsedMilliseconds; errorReader.Join(5000); outputReader.Join(5000); List<string> compOutput = new List<string>(); compOutput.Add(output.Output); if (is_killed) { error.Output = "Compilation terminated after 30 seconds. " + Environment.NewLine + error.Output; } compOutput.Add(error.Output); return compOutput; } }
public OutputData DoWork(InputData idata) { CompilerData cdata = null; try { OutputData odata = new OutputData(); cdata = CreateExecutable(idata); if (!cdata.Success) { odata.Errors = cdata.Error; odata.Warnings = cdata.Warning; odata.Stats = string.Format("Compilation time: {0} sec", Math.Round((double)cdata.CompileTimeMs / (double)1000, 2)); return(odata); } if (!string.IsNullOrEmpty(cdata.Warning)) { odata.Warnings = cdata.Warning; } Stopwatch watch = new Stopwatch(); watch.Start(); using (Process process = new Process()) using (var job = new Job()) { process.StartInfo.FileName = cdata.Executor + (string.IsNullOrEmpty(cdata.Executor) ? "" : " ") + cdata.ExecuteThis; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = true; process.Start(); job.AddProcess(process.Handle); if (!string.IsNullOrEmpty(idata.Input)) { InputWriter input = new InputWriter(process.StandardInput, idata.Input); Thread inputWriter = new Thread(new ThreadStart(input.Writeinput)); inputWriter.Start(); } OutputReader output = new OutputReader(process.StandardOutput); Thread outputReader = new Thread(new ThreadStart(output.ReadOutput)); outputReader.Start(); OutputReader error = new OutputReader(process.StandardError); Thread errorReader = new Thread(new ThreadStart(error.ReadOutput)); errorReader.Start(); var start = DateTime.Now; bool killed = false; do { // Refresh the current process property values. process.Refresh(); if (!process.HasExited) { try { if (start + TimeSpan.FromSeconds(10) < DateTime.Now) { process.Kill(); var res = string.Format("Process killed because it ran longer than 10 seconds"); odata.Errors = res; odata.Output = output.Builder.ToString(); killed = true; } } catch (InvalidOperationException) { break; } } }while (!process.WaitForExit(10)); process.WaitForExit(); if (!killed) { errorReader.Join(5000); outputReader.Join(5000); if (process.ExitCode != 0) { error.Output = string.Format("Process exit code is not 0: {0}\n", process.ExitCode) + error.Output; } odata.Errors = error.Output; odata.Output = output.Output; } } watch.Stop(); if (Utils.IsCompiled(idata.Lang)) { //odata.Stats = string.Format("Compilation time: {0} sec, absolute running time: {1} sec, cpu time: {2} sec, memory peak: {3} Mb", Math.Round((double)cdata.CompileTimeMs / (double)1000, 2), Math.Round((double)watch.ElapsedMilliseconds / (double)1000, 2), Math.Round(CpuTimeInSec, 2), MemoryPickInKilobytes / 1024); odata.Stats = string.Format("Compilation time: {0} sec, absolute running time: {1} sec", Math.Round((double)cdata.CompileTimeMs / (double)1000, 2), Math.Round((double)watch.ElapsedMilliseconds / (double)1000, 2)); } else { //odata.Stats = string.Format("Absolute running time: {0} sec, cpu time: {1} sec, memory peak: {2} Mb", Math.Round((double)watch.ElapsedMilliseconds / (double)1000, 2), Math.Round(CpuTimeInSec, 2), MemoryPickInKilobytes / 1024); odata.Stats = string.Format("Absolute running time: {0} sec", Math.Round((double)watch.ElapsedMilliseconds / (double)1000, 2)); } return(odata); } catch (Exception ex) { return(new OutputData() { System_Error = ex.Message }); } finally { if (cdata != null) { Cleanup(cdata.CleanThis); } } }