Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1255071971
Маркабес
2009-10-09 11:06
2009.11.22
в Чем ошибка......? в условии


15-1251547820
Kerk
2009-08-29 16:10
2009.11.22
Захват потокового видео из браузера


6-1210167194
tytus
2008-05-07 17:33
2009.11.22
TRemoteDataModule и IP клиента.


10-1159674288
arty
2006-10-01 07:44
2009.11.22
Delphi+MathCad


11-1199016802
jabu
2007-12-30 15:13
2009.11.22
Form.ActiveControl not work





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский