public void Start() { if (!System.IO.Directory.Exists(CompileInfo.WorkingDirectory)) { System.IO.Directory.CreateDirectory(CompileInfo.WorkingDirectory); Runner Runner = new Judge.Runner(); } if (!System.IO.File.Exists(CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Main" + GetExtension(CompileInfo.Language))) { File.WriteAllText(CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Main" + GetExtension(CompileInfo.Language), CompileInfo.Source); } if (CenaPlus.Judge.Compiler.NeedCompile.Contains(CompileInfo.Language)) { Runner = new Runner(); Runner.RunnerInfo.CenaCoreDirectory = CompileInfo.CenaCoreDirectory; Runner.RunnerInfo.Cmd = CompileInfo.Arguments; Runner.RunnerInfo.HighPriorityTime = 1000; Runner.RunnerInfo.MemoryLimit = 64 * 1024; Runner.RunnerInfo.StdErrFile = CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Compile.err"; Runner.RunnerInfo.StdOutFile = CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Compile.out"; Runner.RunnerInfo.TimeLimit = 3000; Runner.RunnerInfo.WorkingDirectory = CompileInfo.WorkingDirectory; Runner.Identity = Identity; Runner.RunnerInfo.KillProcessTree = true; Runner.EnvironmentVariables = EnvironmentVariables; Runner.Start(); } }
public void Start() { if (!System.IO.Directory.Exists(CompileInfo.WorkingDirectory)) { System.IO.Directory.CreateDirectory(CompileInfo.WorkingDirectory); Runner Runner = new Judge.Runner(); } if (!System.IO.File.Exists(CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Main" + GetExtension(CompileInfo.Language))) File.WriteAllText(CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Main" + GetExtension(CompileInfo.Language), CompileInfo.Source); if (CenaPlus.Judge.Compiler.NeedCompile.Contains(CompileInfo.Language)) { Runner = new Runner(); Runner.RunnerInfo.CenaCoreDirectory = CompileInfo.CenaCoreDirectory; Runner.RunnerInfo.Cmd = CompileInfo.Arguments; Runner.RunnerInfo.HighPriorityTime = 1000; Runner.RunnerInfo.MemoryLimit = 64 * 1024; Runner.RunnerInfo.StdErrFile = CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Compile.err"; Runner.RunnerInfo.StdOutFile = CompileInfo.WorkingDirectory.TrimEnd('\\') + "\\Compile.out"; Runner.RunnerInfo.TimeLimit = 3000; Runner.RunnerInfo.WorkingDirectory = CompileInfo.WorkingDirectory; Runner.Identity = Identity; Runner.RunnerInfo.KillProcessTree = true; Runner.EnvironmentVariables = EnvironmentVariables; Runner.Start(); } }
public void Judge(object JudgeTask) { while (CurrentCount >= CoreCount) { System.Threading.Thread.Sleep(1000); } CurrentCount++; var jt = JudgeTask as ResultListBoxItem; jt.Status = Entity.RecordStatus.SystemError; CenaPlus.Judge.Runner Runner = new Judge.Runner(); switch (Static.Language) { case Entity.ProgrammingLanguage.Java: Runner.RunnerInfo.Cmd = "java Main"; break; case Entity.ProgrammingLanguage.Python27: case Entity.ProgrammingLanguage.Python33: Runner.RunnerInfo.Cmd = "python Main.py"; break; case Entity.ProgrammingLanguage.Ruby: Runner.RunnerInfo.Cmd = "ruby Main.rb"; break; default: Runner.RunnerInfo.Cmd = "Main.exe"; break; } Runner.RunnerInfo.HighPriorityTime = 1000; Runner.RunnerInfo.MemoryLimit = Static.MemoryLimit; Runner.RunnerInfo.StdInFile = jt.TestCase.Input; Runner.RunnerInfo.StdOutFile = Static.WorkingDirectory + "\\" + jt.TestCase.Index + ".user.out"; Runner.RunnerInfo.TimeLimit = Static.TimeLimit; Runner.RunnerInfo.WorkingDirectory = Static.WorkingDirectory; Runner.RunnerInfo.CenaCoreDirectory = Environment.CurrentDirectory + "\\Core\\CenaPlus.Core.exe"; Runner.Start(); jt.Time = Runner.RunnerResult.TimeUsed; jt.Memory = Runner.RunnerResult.PagedSize; if (Static.Language == Entity.ProgrammingLanguage.Java) { jt.Memory = Runner.RunnerResult.WorkingSetSize; } if (jt.Time > Static.TimeLimit) { jt.Status = Entity.RecordStatus.TimeLimitExceeded; } else if (jt.Memory > Static.MemoryLimit) { jt.Status = Entity.RecordStatus.MemoryLimitExceeded; } else if (Runner.RunnerResult.ExitCode != 0) { jt.Status = Entity.RecordStatus.RuntimeError; } else if (Static.Language != Entity.ProgrammingLanguage.C && Runner.RunnerResult.ExitCode != 1 && Runner.RunnerResult.ExitCode != 0) { jt.Status = Entity.RecordStatus.RuntimeError; } else { { // TODO: Validate Runner = null; GC.Collect(); Runner = new Judge.Runner(); Runner.RunnerInfo.StdOutFile = Static.WorkingDirectory + "\\" + jt.TestCase.Index + ".validator.out"; Runner.RunnerInfo.HighPriorityTime = 1000; Runner.RunnerInfo.MemoryLimit = 1024 * 128; Runner.RunnerInfo.TimeLimit = 3000; Runner.RunnerInfo.WorkingDirectory = Static.WorkingDirectory; Runner.RunnerInfo.CenaCoreDirectory = Environment.CurrentDirectory + "\\Core\\CenaPlus.Core.exe"; System.IO.File.Copy(jt.TestCase.Input, Static.WorkingDirectory + "\\input" + jt.TestCase.Index + ".in", true); System.IO.File.Copy(jt.TestCase.Output, Static.WorkingDirectory + "\\output" + jt.TestCase.Index + ".out", true); Runner.RunnerInfo.Cmd = String.Format("{0} {1} {2} {3}", "spj.exe", "output" + jt.TestCase.Index + ".out", jt.TestCase.Index + ".user.out", "\\input" + jt.TestCase.Index + ".in"); Runner.Start(); if (Runner.RunnerResult.ExitCode >= 0 && Runner.RunnerResult.ExitCode <= 2) { jt.Status = (Entity.RecordStatus)Runner.RunnerResult.ExitCode; try { jt.Detail = System.IO.File.ReadAllText(Static.WorkingDirectory + "\\" + jt.TestCase.Index + ".validator.out"); } catch { } } else { jt.Status = Entity.RecordStatus.ValidatorError; } } } Dispatcher.Invoke(new Action(() => { ResultListBoxItems.Add(jt); ResultListBoxItems.Sort((a, b) => a.TestCase.Index - b.TestCase.Index); ResultListBox.Items.Refresh(); })); CurrentCount--; }