если вся эта контрольно-отслеживетельная программа будет работать помоему она будет заметно тормозить тестируемую программу и результаты не будут верны
Нет, с результатами-то все нормально будет. Ставим приоритет у создаваемого процесса RealTime, закрываем всякие антивирусы Касперского
. Автоматические тестирующие системы используют на олимпиадах по информатике высокого уровня, проблем никаких (правда, как их пишут?). И к тому же, с учетом специфики тестирующей системы, можно на задачу времени дать с небольшим запасом, чтобы к системе претензий не было.
Я вот нашел на
http://forum.sources.ru/index.php?showtopic=94309 некоторую информацию. Ситуация у меня такая, что я работаю в виндовском Лазарусе из под вайна (кстати, при этом наблюдаются некоторые баги). Это - чтобы не мучаться с переносом потом на винду, да и смело использовать WinAPI.
Вот пример с
http://forum.sources.ru/index.php?showtopic=94309 от oleg_v:
var
ProcMemCount : PROCESS_MEMORY_COUNTERS;
ProcessID : Cardinal;
hCurrWindow : HWND;
hProcess : THandle;
begin
hCurrWindow := GetForegroundWindow;// берем хендл активного окна
GetWindowThreadProcessId(hCurrWindow,@ProcessID);// достаем ID процесса по хендлу окна
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID); //по текущему ID процесса получаем хендл на процесс
GetProcessMemoryInfo(hProcess,@ProcMemCount,SizeOf(ProcMemCount)); // в ProcMemCount получаем счетчики памяти
// такие же значения показывает Task manager в Windows
//ProcMemCount.PageFaultCount - Кол-во ошибочных обращений к странице памяти
//ProcMemCount.PeakWorkingSetSize/1024 - Пиковое исп. памяти, Кб
//ProcMemCount.WorkingSetSize/1024 - Текущее исп. памяти, Кб
//ProcMemCount.QuotaPeakPagedPoolUsage/1024 - Пиковый выгружаемый пул, Кб
//ProcMemCount.QuotaPagedPoolUsage/1024 - Текущий выгружаемый пул, Кб
//ProcMemCount.QuotaPeakNonPagedPoolUsage/1024 - Пиковый невыгружаемый пул, Кб
//ProcMemCount.QuotaNonPagedPoolUsage/1024 - Текущий невыгружаемый пул, Кб
//ProcMemCount.PagefileUsage/1024 - Текущее исп. файла подкачки, Кб
//ProcMemCount.PeakPagefileUsage/1024 - Пиковое исп. файла подкачки, Кб
CloseHandle(hProcess);
end;
Во первых, в Лазарусе функции GetProcessMemoryInfo второй аргумент передается по ссылке, а не как в примере, где передается адрес.
Я решил, для надежности, вызвать функцию GetProcessMemoryInfo так: у меня есть Process1: TProcess, запускаю через него, например, блокнот (c:\windows\notepad.exe) по нажатию на первую кнопочку. По нажатии на вторую кнопку:
procedure TForm1.Button2Click(Sender: TObject);
var ProcMemCount : PROCESS_MEMORY_COUNTERS;
begin
if not GetProcessMemoryInfo(Process1.Handle,ProcMemCount,SizeOf(ProcMemCount)) then
showmessage('Something is not good...');
Label1.Caption:=inttostr(ProcMemCount.PeakWorkingSetSize{GetProcessMemory});
end;
То есть первый аргумент GetProcessMemoryInfo - уже известный хендл процесса, запущенного через Process1 .
В итоге, в Label1 у меня 0. Кстати, все поля ProcMemCount после вызова GetProcessMemoryInfo становятся нулевыми, кроме CB=40.
Возможно, виноват WINE. На
http://forum.sources.ru/index.php?showtopic=94309 пишут, что GetProcessMemoryInfo не работает под Windows98. Но вроде-бы Вайн эмулирует XP. У меня, по крайней мере так в настройках
.
Итак, может кто-нибудь что-либо подскажет?