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

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

Pibka

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

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

подскажите кто знает???
 
X

xKlonx

Я не специалист в делфи но подобная ошибка была на шарпе, вам нужно делать какой-то CloseFile(F), или что-то подобное
 
V

vital

Ой фигню ты рома написал=)
Там по ссылке просто описание как считать\записать в файл. И ничего больше. А про механизм блокировок вот что я советую посмотреть:
 
X

xKlonx

Может и так я не спорю).Но подобное было, вылечило закрытием привязки, я думаю в делфи есть какой-то метод Close, а вдруг поможет
 
P

Pibka

Если кто нибуть ещё знает по этой теме напишите заранее спс
 
V

vital

А еще.. как метод магии.. ПОробуй для начала открыть файл так - F := TFileStream.Create(Filee, fmShareDenyNone);. В случае текстового файла - его можно будет прочитать.
 
P

Pibka

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; //вот конец копирования ВОТ приэтом КОПИРОВАНИИ У МЕЯ И ВЫДАЁТ ОШИБКУ!!!!!
 
P

Pibka

может я неправильно в начале изложил проблему поэтому излагаю заново

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

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


если убрать ",fmCreate" то выдаёт ошибку "strim write error"(как я понял это ошибка потоков)
 
P

Pibka

Олимпиадная задача- Это программа написанная на паскале. Вот она и зацикливается. она файл и держит. запцикливается она когда ученик неправвильно её написал
 
V

vital

Ну тогда при чем тут текстовый файл? Вам нужно запускать саму программу в режиме отладки, считать сколько времени она выполняется и если больше допустимого - то вырубать принудительно. Тогда и файл освободится...
 
P

Pibka

Ну тогда при чем тут текстовый файл? Вам нужно запускать саму программу в режиме отладки, считать сколько времени она выполняется и если больше допустимого - то вырубать принудительно. Тогда и файл освободится...
А как запустить её в режиме отладки?
 
V

vital

Например так..
Код:
#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);
//...
 
P

Pibka

спасибо я попробую это пережевать
 
Мы в соцсетях:

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