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

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