前做了一個簡單實用的本地程序評測機,用作學校某比賽的評測(該比賽不是在線比賽,而是做完后自己發代碼然后我們自己手動萍。。囧),該程序是一個本地評測系統,用戶輸入單文件代碼或可執行程序,和輸入數據和正確的輸出數據,系統根據這些數據對代碼或程序進行評測。
評測結果有:
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 閱讀(341)
評論(1) 編輯 收藏 引用