Форум: "Основная";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
ВнизКак узнать, какой из тредов зашарил файл Найти похожие ветки
← →
Дмитрий Белькевич © (2008-10-30 12:21) [0]Есть некое многопоточное приложение.
Вероятнее всего, какой-то из тредов зашаривает файл на себя и не даёт его переименовать. GetLastError возвращает "Процесс не может получить доступ к файлу, так как этот файл занят другим процессом".
Можно ли как-то по имени файла узнать, какой из тредов приложения его зашарил?
Спасибо за ответы.
← →
Rouse_ © (2008-10-30 12:33) [1]Делай всю работу с файлом внутри критической секции, там же и выставляй ID нити, занявшей КС...
← →
Дмитрий Белькевич © (2008-10-30 12:59) [2]Самое странное, что до того, как какой-либо из тредов оставит файл в покое, другие не должны вообще его открывать и даже не могут знать о его наличии. А вот такая вот проблема...
← →
Дмитрий Белькевич © (2008-10-30 13:02) [3]еще вопрос, я кое-где так делаю:
{$I-}
Reset(fp, 1);
if IOResult <> 0 then
Exit;
{$I+}
CloseFile(fp);
здесь не может быть проблем?
← →
Сергей М. © (2008-10-30 13:05) [4]
> Дмитрий Белькевич © (30.10.08 12:59) [2]
Ну перехвати вызовы CreateFile и OpenFile да посмотри в каких потоках они вызываются ..
← →
Rouse_ © (2008-10-30 13:05) [5]
> здесь не может быть проблем?
Здесь проблема есть, CloseFile в секцию finally вынеси и тогда проблемы не будет.
← →
Сергей М. © (2008-10-30 13:06) [6]
> Дмитрий Белькевич © (30.10.08 13:02) [3]
А в чем прелесть работы с файлом устаревшими паскалевыми процедурами ?
← →
Дмитрий Белькевич © (2008-10-30 13:08) [7]еще вопрос, я кое-где так делаю:
{$I-}
Reset(fp, 1);
if IOResult <> 0 then
Exit;
{$I+}
CloseFile(fp);
здесь не может быть проблем?
← →
Дмитрий Белькевич © (2008-10-30 13:40) [8]Сорри за повторы - сайт нестабильно работает почему-то....
>Здесь проблема есть, CloseFile в секцию finally вынеси и тогда проблемы не будет.
То есть, даже не взирая на ошибку при открытии файл может оказаться всё таки отрытым?
Я боюсь, что вылезет еще одна проблема - что, если файл всё таки не открылся, то CloseFile вызовет ошибку. Что делать? Ловить её try/exception"ом? Может можно как-то файлову переменную проверить - открыта ли она?
>А в чем прелесть работы с файлом устаревшими паскалевыми процедурами
?
try/exception лучше был бы?
← →
Сергей М. © (2008-10-30 13:45) [9]
> сайт нестабильно работает почему-то
Да дерьмово он работает, что уж тут говорить .. С каждым днем все хуже и хуже
> если файл всё таки не открылся, то CloseFile вызовет ошибку
Не вызовет.
CloseFile быдет вызвана только в случае успешного перед этим открытия файла:
ОткрытьФайл
try
.. работиа с файлом ..
finally
ЗакрытьФайл
end
← →
Anatoly Podgoretsky © (2008-10-30 14:51) [10]> Дмитрий Белькевич (30.10.2008 13:40:08) [8]
Не лучше, а неправильно
← →
Дмитрий Белькевич © (2008-10-30 15:06) [11]>>А в чем прелесть работы с файлом устаревшими паскалевыми процедурами
>> Дмитрий Белькевич (30.10.2008 13:40:08) [8]
>Не лучше, а неправильно
Так как правильно сделать? try/exception или IOResult <> 0 или еще как?
Я не помню, к сожалению, почему конкретно так делал - уже года три назад было... Коменты иногда рулят, да ;)
← →
Сергей М. © (2008-10-30 15:23) [12]
> Дмитрий Белькевич © (30.10.08 15:06) [11]
"Так не бывает - тут помню, тут не помню" (с)
)
> как правильно сделать?
Без разницы.
Либо ты придерживаешься дельфийской концепции исключений, либо не придерживаешься и работаешь с кодами ошибок - выбирать тебе.
Но если ты успешно открыл файл, то ты обязан его закрыть в любом случае, вне зависимости от того, были ли или не были ошибки или исключения в процессе работы с ранее открытым файлом.
Поэтому псевдокод в [9] актуален при любом твоем выборе.
ОткрытьФайл
Если РезультатОткрытия есть Успех Тогда // эта проверка нужна для прямой работы с IOResult, т.е. если шаг ОткрытьФайл выполняется между {$I-} и {$I+}
try
.. работа с файлом .. // здесь возможны исключения (*)
finally
ЗакрытьФайл // что бы ни произошло при (*), эта строчка обязательно получит управление
end
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.11.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c