前做了一個(gè)簡單實(shí)用的本地程序評(píng)測機(jī),用作學(xué)校某比賽的評(píng)測(該比賽不是在線比賽,而是做完后自己發(fā)代碼然后我們自己手動(dòng)萍。。囧),該程序是一個(gè)本地評(píng)測系統(tǒng),用戶輸入單文件代碼或可執(zhí)行程序,和輸入數(shù)據(jù)和正確的輸出數(shù)據(jù),系統(tǒng)根據(jù)這些數(shù)據(jù)對(duì)代碼或程序進(jìn)行評(píng)測。
評(píng)測結(jié)果有:
Accept //通過
Compile Error //編譯錯(cuò)誤
Worng Answer //答案錯(cuò)誤
Time Limit Exceeded //超時(shí)
Memory Limit Exceeded //超內(nèi)存
Presentation Error //輸出格式錯(cuò)誤
System Error //系統(tǒng)錯(cuò)誤
下面簡單聊聊實(shí)現(xiàn)的過程:
一、實(shí)現(xiàn)細(xì)節(jié)
1.1 編譯功能
類:CompilerHelper
函數(shù):static int compile(const std::string& sSourceFile, //源文件路徑
const std::string& sOutputFile);//執(zhí)行代碼路徑
流程如下:
生成編譯器輸入?yún)?shù)(編譯器路徑、文件路徑、包含路徑、庫路徑)在config.txt定義
-> 重定向in和out -> 創(chuàng)建進(jìn)程編譯->等待完畢后返回執(zhí)行結(jié)果
1.2 評(píng)測功能
需要獲得 執(zhí)行代碼路徑、輸入文件、期待輸出的答案文件、本次執(zhí)行程序的實(shí)際輸出文件、
時(shí)間、內(nèi)存、是不是SPJ
監(jiān)視器線程: 監(jiān)視進(jìn)程的執(zhí)行時(shí)間、使用內(nèi)存的信息
流程:
輸入信息-> 根據(jù)輸入文件產(chǎn)生輸入?yún)?shù)->創(chuàng)建進(jìn)程->監(jiān)視器開啟->等待直到結(jié)束
->返回!=0?"System Error" : 記錄本次執(zhí)行所需要的時(shí)間和內(nèi)存->是否SPJ?啟動(dòng)spj比較器
:啟動(dòng)文件比較器
啟動(dòng)文件比較器: 比較實(shí)際的和答案的差異,完全相同的AC,只存在空格的差異為PE,其他情況的WA
spj比較器: 使用自己編寫的spj程序?qū)蓚€(gè)文件評(píng)測
1.3 測試套件
實(shí)現(xiàn)多個(gè)測試用例(多個(gè)輸入文件和輸出文件)
可以通過配置文件進(jìn)行配置
配置文件如下:
[TestSuite]
TestCaseCount=19 //用例個(gè)數(shù)
IsSpecialJudge=0 //是否SPJ
CodeFile=main.cpp //源文件,可設(shè)為NULL
SPJExe=lowSPJ.exe //SPJ路徑
ExecuteFile=NULL //如設(shè)置了就不啟用編譯功能
[TestCase_n] //第n個(gè)用例
TimeLimit=1000 //時(shí)間限制
MemoryLimit=65535 //內(nèi)存限制(KB)
StdInputFile=data1.txt //輸入文件
AnswerFile=output1.txt //答案
每個(gè)用例將new一個(gè)judgerunner實(shí)例
二、依賴庫
個(gè)人開發(fā)的mtLibrary中的Common、Thread、Process庫模塊
三、運(yùn)行效果
配置文件示例
[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
這是運(yùn)行的效果,運(yùn)行后結(jié)果將保存帶JudgeResult.txt中

posted on 2012-03-02 20:30
bennycen 閱讀(351)
評(píng)論(1) 編輯 收藏 引用