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