Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: -0.991 c
2-1254737942
fics)
2009-10-05 14:19
2009.11.22
Массивы


10-1161585328
Max Ivanych
2006-10-23 10:35
2009.11.22
Передача формулы c кириллицей в ячейку Excel


3-1230036426
interbase
2008-12-23 15:47
2009.11.22
производная таблица


15-1253775669
Knight
2009-09-24 11:01
2009.11.22
Можно снять изображение с формы как-то ещё кроме GetFormImage?


15-1253441135
Aston
2009-09-20 14:05
2009.11.22
Компанент для создания игр




   Наверх