Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать, какой из тредов зашарил файл [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 нити, занявшей КС...


Наверх

Титульная страница Поиск, карта сайта Написать письмо