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

Тема в разделе "Delphi - Система", создана пользователем Pibka, 29 дек 2009.

  1. Pibka

    Pibka Гость

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

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

    подскажите кто знает???
     
  2. xKlonx

    xKlonx Lotus team
    Lotus team

    Регистрация:
    10 сен 2009
    Сообщения:
    412
    Симпатии:
    0
    Я не специалист в делфи но подобная ошибка была на шарпе, вам нужно делать какой-то CloseFile(F), или что-то подобное
    http://www.festra.com/eng/snip02.htm
     
  3. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Ой фигню ты рома написал=)
    Там по ссылке просто описание как считать\записать в файл. И ничего больше. А про механизм блокировок вот что я советую посмотреть:
    http://wasm.ru/article.php?article=lockfileswork
     
  4. xKlonx

    xKlonx Lotus team
    Lotus team

    Регистрация:
    10 сен 2009
    Сообщения:
    412
    Симпатии:
    0
    Может и так я не спорю).Но подобное было, вылечило закрытием привязки, я думаю в делфи есть какой-то метод Close, а вдруг поможет
     
  5. Pibka

    Pibka Гость

    спасибо то что нужно помойму
    проверить надо ща займусь
     
  6. Pibka

    Pibka Гость

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

    vital Больной Компом Детектед

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

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

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    ,fmCreate - убери
     
  10. Pibka

    Pibka Гость

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

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

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

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

    Pibka Гость

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

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Ну тогда при чем тут текстовый файл? Вам нужно запускать саму программу в режиме отладки, считать сколько времени она выполняется и если больше допустимого - то вырубать принудительно. Тогда и файл освободится...
     
  13. Pibka

    Pibka Гость

    А как запустить её в режиме отладки?
     
  14. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Например так..
    Код (Text):
     
    #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);
    //...
     
  15. Pibka

    Pibka Гость

    спасибо я попробую это пережевать
     

Поделиться этой страницей