Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.22;
Скачать: CL | DM;

Вниз

Как узнать, какой из тредов зашарил файл   Найти похожие ветки 

 
Дмитрий Белькевич ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
4-1222062804
Riply
2008-09-22 09:53
2009.11.22
kernel-mode и потоко-безопасный лог.


2-1255147550
NGPOL
2009-10-10 08:05
2009.11.22
Виснет прога во время ExecSQL


15-1253971366
Джони
2009-09-26 17:22
2009.11.22
DAC for MySQL 2.7.2 Free Trial (Объясните пжл)


15-1253630278
TRSteep
2009-09-22 18:37
2009.11.22
Авто дописывание кода


15-1253963283
@!!ex
2009-09-26 15:08
2009.11.22
Можно ли припаять микрофон к выходу на микрофон в ноуте?