фаил занет другим приложением

  • Автор темы Автор темы Pibka
  • Дата начала Дата начала
P

Pibka

Я сейчас написал на делфи программу для проверки олимпиадных задач(олимпиадных задача написана на паскале). олимпиадная задача считывает все данные с файла и записывает в файл. Суть моей программы заключается в том что она заменяет файл с входными данными на заранее подготовленный файл. запускает ехе олимп. задачи и по её завершеннии сравнивает выходные файлы (1 файл заранее подготовленный, 2 файл выданной олимпиад. задачи) и так некоторое количество заранее подготовленных файлов (Во избежание случайностей).

Так вот проблема когда идёт зацикливание олимпиадной задачи моя программа закрывает её принудительно. после чего запускает её ещё раз с другим входным файлом. но бывает что связи между ехе олимпиадной задачи и входным файлом остаются.и прнизамене его на другой входной файл система соответственно выдаёт ошибку. как можно избавится от этой проблеммы?

подскажите кто знает???
 
Я не специалист в делфи но подобная ошибка была на шарпе, вам нужно делать какой-то CloseFile(F), или что-то подобное
 
Ой фигню ты рома написал=)
Там по ссылке просто описание как считать\записать в файл. И ничего больше. А про механизм блокировок вот что я советую посмотреть:
 
Может и так я не спорю).Но подобное было, вылечило закрытием привязки, я думаю в делфи есть какой-то метод Close, а вдруг поможет
 
Если кто нибуть ещё знает по этой теме напишите заранее спс
 
А еще.. как метод магии.. ПОробуй для начала открыть файл так - F := TFileStream.Create(Filee, fmShareDenyNone);. В случае текстового файла - его можно будет прочитать.
 
Source:=TFileStream.Create(PathCopyFrom, fmOpenRead or fmShareDenyWrite); //ВОТ НАЧАЛО КОПИРОВАНИЯ ФАЙЛА
try
Destination := TFileStream.Create(PathCopyTo,fmCreate or fmShareDenyRead);
try
Destination.CopyFrom(Source,Source.Size);
finally
Destination.Free;
end;
finally
Source.Free
end; //вот конец копирования ВОТ приэтом КОПИРОВАНИИ У МЕЯ И ВЫДАЁТ ОШИБКУ!!!!!
 
может я неправильно в начале изложил проблему поэтому излагаю заново

Я сейчас написал на делфи программу для проверки олимпиадных задач(олимпиадных задача написана на паскале). олимпиадная задача считывает все данные с файла и записывает в файл. Суть моей программы заключается в том что она заменяет файл с входными данными на заранее подготовленный файл. запускает ехе олимп. задачи и по её завершеннии сравнивает выходные файлы (1 файл заранее подготовленный, 2 файл выданной олимпиад. задачи) и так некоторое количество заранее подготовленных файлов (Во избежание случайностей).

Так вот проблема когда идёт зацикливание олимпиадной задачи моя программа закрывает её принудительно. после чего запускает её ещё раз с другим входным файлом. но бывает что связи между ехе олимпиадной задачи и входным файлом остаются.и прнизамене его на другой входной файл система соответственно выдаёт ошибку(файл занят другим приложением). как можно избавится от этой проблеммы?


если убрать ",fmCreate" то выдаёт ошибку "strim write error"(как я понял это ошибка потоков)
 
Олимпиадная задача- Это программа написанная на паскале. Вот она и зацикливается. она файл и держит. запцикливается она когда ученик неправвильно её написал
 
Ну тогда при чем тут текстовый файл? Вам нужно запускать саму программу в режиме отладки, считать сколько времени она выполняется и если больше допустимого - то вырубать принудительно. Тогда и файл освободится...
 
Ну тогда при чем тут текстовый файл? Вам нужно запускать саму программу в режиме отладки, считать сколько времени она выполняется и если больше допустимого - то вырубать принудительно. Тогда и файл освободится...
А как запустить её в режиме отладки?
 
Например так..
Код:
#define TIME_LIMIT 100000000  //1 секунда
#define MEMORY_LIMIT 67108864 //64 мб
//...
HANDLE hjob = CreateJobObject(NULL, NULL);

JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = {0};
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobeli={0};

jobli.PriorityClass = IDLE_PRIORITY_CLASS;
jobli.PerJobUserTimeLimit.QuadPart = TIME_LIMIT;

jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME | 
JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | JOB_OBJECT_LIMIT_JOB_MEMORY;

jobeli.BasicLimitInformation=jobli;
jobeli.JobMemoryLimit=MEMORY_LIMIT;

SetInformationJobObject(hjob, JobObjectExtendedLimitInformation, &jobeli, sizeof(jobeli));

JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
jobuir.UIRestrictionsClass=JOB_OBJECT_UILIMIT_ALL;
SetInformationJobObject(hjob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));  

g_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);//Для отлова событий Job
JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp = { (PVOID) ((UINT_PTR) 2), g_hIOCP };
SetInformationJobObject(hjob,JobObjectAssociateCompletionPortInformation,&joacp, sizeof(joacp));	

JOBOBJECT_END_OF_JOB_TIME_INFORMATION joeojti;
joeojti.EndOfJobTimeAction =JOB_OBJECT_POST_AT_END_OF_JOB;
SetInformationJobObject(hjob, JobObjectEndOfJobTimeInformation, &joeojti, sizeof(joeojti));

STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi; 
CreateProcessA(NULL, "test_program.exe", NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
AssignProcessToJobObject(hjob, pi.hProcess);

ResumeThread(pi.hThread); 
CloseHandle(pi.hThread);

DWORD dwBytesXferred;
ULONG_PTR CompKey;
LPOVERLAPPED po;
start:
GetQueuedCompletionStatus(g_hIOCP,
&dwBytesXferred, &CompKey, &po, INFINITE);
cout<<dwBytesXferred<<endl;
switch (dwBytesXferred) 
{
case JOB_OBJECT_MSG_END_OF_JOB_TIME:
case JOB_OBJECT_MSG_END_OF_PROCESS_TIME:
printf("Time limit");
TerminateJobObject(hjob,0);
break;
case JOB_OBJECT_MSG_EXIT_PROCESS:
cout<<"Normal exit";
break;
case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
case JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:
cout<<"Memory limit";
break;
case JOB_OBJECT_MSG_NEW_PROCESS://для пропуска этого события.
goto start;
}
cout<<endl;
DWORD a;
JOBOBJECT_BASIC_ACCOUNTING_INFORMATION jobai;
QueryInformationJobObject(hjob,JobObjectExtendedLimitInformation, &jobeli,sizeof(jobeli),&a);
QueryInformationJobObject(hjob,JobObjectBasicAccountingInformation,&jobai,sizeof(jobai),&a);
//Вывод данных об используемом времени/памяти
cout<<jobeli.PeakJobMemoryUsed<<" bytes,"<<jobai.TotalUserTime.QuadPart/10000<<" msec";
CloseHandle(pi.hProcess);
CloseHandle(hjob);
//...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!