예제 #1
0
 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();
     }
 }
예제 #2
0
파일: Compiler.cs 프로젝트: wan-qy/CenaPlus
 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();
     }
 }
예제 #3
0
        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--;
        }