Контролировать деятельность процесса...

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Контролировать деятельность процесса...

Сообщение Alexey_Bulatov » 25.07.2008 10:45:49

Здравствуйте. Передо мной встала задача - написать автоматизированную тестирующую систему для олимпиады по инфоматике (под винду). Она что делает: запускает программу, написанную участником, предварительно подсунув ей входные данные, контролирует, чтобы эта программа работала не больше по времени, чем оговорено (Time Limit), также использовала памяти не больше, чем оговорено, не создавала и не пыталась открыть никаких файлов, кроме файлов со входными и выходными данными. (Ну и все это, конечно, красиво отобажаеся на экране).
Посоветуйте пожалуйста, что лучше использовать для запуска программ-решений. Использовать TProcess - то как тогда контролировать память и файлы? Конечно, это как-то можно через WinAPI, но его я совсем не знаю. Видимо, нужно сначала CreateProcess(...), потом, если за время положеное вылез, TerminateProcess(...). А вот как за памятью следить и за файлами... Подскажите пожалуйста, как это делать.
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород

Re: Контролировать деятельность процесса...

Сообщение FedeX » 25.07.2008 11:39:24

Помоему это только при помощи debug api можно сделать (DebugActiveProcess и т.д.) и то столько гемороя будет что закопаетесь. ИМХО поставленная задача не стоит средств на реализацию, тем более если с WinAPI мало знакомы. К тому же, если вся эта контрольно-отслеживетельная программа будет работать помоему она будет заметно тормозить тестируемую программу и результаты не будут верны :wink:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Контролировать деятельность процесса...

Сообщение Alexey_Bulatov » 25.07.2008 14:10:42

если вся эта контрольно-отслеживетельная программа будет работать помоему она будет заметно тормозить тестируемую программу и результаты не будут верны

Нет, с результатами-то все нормально будет. Ставим приоритет у создаваемого процесса 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. У меня, по крайней мере так в настройках :).

Итак, может кто-нибудь что-либо подскажет?
Alexey_Bulatov
незнакомец
 
Сообщения: 6
Зарегистрирован: 10.03.2008 23:03:32
Откуда: Россия, Нижний Новгород

Re: Контролировать деятельность процесса...

Сообщение FedeX » 25.07.2008 17:05:29

Ужос! Ещё хотите чтоб в Ване работало. Сочувствую :roll:
Я проверил - в WindowsXP код
Код: Выделить всё
uses JwaPsApi; .......
hCurrWindow := GetForegroundWindow;
GetWindowThreadProcessId(hCurrWindow,@ProcessID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
GetProcessMemoryInfo(hProcess,ProcMemCount,SizeOf(ProcMemCount));
caption:= inttostr(round( ProcMemCount.WorkingSetSize/1024));
CloseHandle(hProcess);

...работает. Причём выдаёт точное значение. Так что проблема, как и следовало ожидать в Wine.

Когда я говорил что прога ваша для тестов может занимать очень много ресурсов я имел в виду конкретно слежение за файловой системой. Я видел одну такую программу (FileMonitor кажеться), так она при работе солидно отжирает проца.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 10

Рейтинг@Mail.ru