前做了一个简单实用的本地程序评测机,用作学校某比赛的评测(该比赛不是在线比赛,而是做完后自己发代码然后我们自己手动萍。。囧),该程序是一个本地评测系统,用户输入单文件代码或可执行程序,和输入数据和正确的输出数据,系统根据这些数据对代码或程序进行评测。
评测结果有:
Accept //通过
Compile Error //编译错误
Worng Answer //答案错误
Time Limit Exceeded //超时
Memory Limit Exceeded //超内存
Presentation Error //输出格式错误
System Error //系统错误
下面简单聊聊实现的过程:
一、实现细节
1.1 编译功能
类:CompilerHelper
函数:static int compile(const std::string& sSourceFile, //源文件路径
const std::string& sOutputFile);//执行代码路径
流程如下:
生成编译器输入参数(编译器路径、文件路径、包含路径、库路径)在config.txt定义
-> 重定向in和out -> 创建进程编译->等待完毕后返回执行结果
1.2 评测功能
需要获得 执行代码路径、输入文件、期待输出的答案文件、本次执行程序的实际输出文件、
时间、内存、是不是SPJ
监视器线程: 监视进程的执行时间、使用内存的信息
流程:
输入信息-> 根据输入文件产生输入参数->创建进程->监视器开启->等待直到结束
->返回!=0?"System Error" : 记录本次执行所需要的时间和内存->是否SPJ?启动spj比较器
:启动文件比较器
启动文件比较器: 比较实际的和答案的差异,完全相同的AC,只存在空格的差异为PE,其他情况的WA
spj比较器: 使用自己编写的spj程序对两个文件评测
1.3 测试套件
实现多个测试用例(多个输入文件和输出文件)
可以通过配置文件进行配置
配置文件如下:
[TestSuite]
TestCaseCount=19 //用例个数
IsSpecialJudge=0 //是否SPJ
CodeFile=main.cpp //源文件,可设为NULL
SPJExe=lowSPJ.exe //SPJ路径
ExecuteFile=NULL //如设置了就不启用编译功能
[TestCase_n] //第n个用例
TimeLimit=1000 //时间限制
MemoryLimit=65535 //内存限制(KB)
StdInputFile=data1.txt //输入文件
AnswerFile=output1.txt //答案
每个用例将new一个judgerunner实例
二、依赖库
个人开发的mtLibrary中的Common、Thread、Process库模块
三、运行效果
配置文件示例
[TestSuite]
TestCaseCount=19
IsSpecialJudge=0
CodeFile=main.cpp
SPJExe=NULL
[TestCase_1]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data1.txt
AnswerFile=output1.txt
[TestCase_2]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data2.txt
AnswerFile=output2.txt
[TestCase_3]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data3.txt
AnswerFile=output3.txt
[TestCase_4]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data4.txt
AnswerFile=output4.txt
[TestCase_5]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data5.txt
AnswerFile=output5.txt
[TestCase_6]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data6.txt
AnswerFile=output6.txt
[TestCase_7]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data7.txt
AnswerFile=output7.txt
[TestCase_8]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data8.txt
AnswerFile=output8.txt
[TestCase_9]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data9.txt
AnswerFile=output9.txt
[TestCase_10]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data10.txt
AnswerFile=output10.txt
[TestCase_11]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data11.txt
AnswerFile=output11.txt
[TestCase_12]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data12.txt
AnswerFile=output12.txt
[TestCase_13]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data13.txt
AnswerFile=output13.txt
[TestCase_14]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data14.txt
AnswerFile=output14.txt
[TestCase_15]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data15.txt
AnswerFile=output15.txt
[TestCase_16]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data16.txt
AnswerFile=output16.txt
[TestCase_17]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data17.txt
AnswerFile=output17.txt
[TestCase_18]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data18.txt
AnswerFile=output18.txt
[TestCase_19]
TimeLimit=1000
MemoryLimit=65535
StdInputFile=data19.txt
AnswerFile=output19.txt
这是运行的效果,运行后结果将保存带JudgeResult.txt中
posted on 2012-03-02 20:30
bennycen 阅读(333)
评论(1) 编辑 收藏 引用