Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Ограничение программы по памяти и времени


Автор: Dreik 27.6.2005, 18:36
Подскажите пожалуйста если кто знает, как запустить из моей программы другую и ограничить ее по памяти (например 2000К) и по времени выполнения (например 2 секунды). Если запущенная прога не укладывается в эти ограничения то выдавать ошибку и завершать ее. smile

Автор: rsm 27.6.2005, 20:27
Думаю будет примерно так...
Код

program mein_project;

uses
  Windows;

var
   si: TStartupInfo;
   pi: TProcessInformation;

const
   nMaxMemSize = 2 * 1048576; // 2 Мб
   nTimeout = 2 * 1000; // 2 секунды
   MIN_MEM_SIZE = 16 * 1024; // минимальный размер выделяемой памяти

begin
   GetStartupInfo(si);
   if not CreateProcess(nil, 'calc.exe', nil, nil,
   false, PROCESS_SET_QUOTA or CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
         MessageBox(0, 'Не могу запустить программу!', nil, MB_ICONERROR);
         exit;
      end;
   if not SetProcessWorkingSetSize(pi.hProcess, MIN_MEM_SIZE, nMaxMemSize) then
      begin
         MessageBox(0, 'Не могу задать размер памяти процесса!', nil, MB_ICONERROR);
         TerminateProcess(pi.hProcess, 0);
         exit;
      end;
   WaitForSingleObject(pi.hProcess, nTimeout);
   TerminateProcess(pi.hProcess, 0);
end.

З.Ы. Вообще старайся поменьше руководить (а лучше - вовсе не руководить) объемом памяти процесса, Винда этого очень не любит.

Автор: Snowy 28.6.2005, 09:01
Для Win2k и старше читай справку по CreateJobObject.
(ограничение почти по любым параметрам)
В Win9x не работает.

Автор: Dreik 29.6.2005, 19:49
Вообще я пишу программу для проверки решений олимпиадных заданий. Т.е. моя задача сначала скомпилировать решение одним из допустимых компиляторов и затем прогнать готовую прогу на наборе из 20-30 тестов. Если на каком-либо тесте она будет работать дольше установленного времени или использовать больше установленной памяти, то она завершается и выдается сообщение об ошибке. Вот в общем то и все smile Может у кого-нибудь будут рекомендации или советы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)