Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
Цитата:
так ты можешь закрывать только хэндл окна  
CloseHandle(FileHandle)
поясни, что ты имеешь в виду:
FileHandle - это хэндл файла, почему ты говоришь о закрытии хэндла окна?
 
может можно иметь одну переменную FileHandle, открывая в неё в цикле хэндл файла и не делать освобождения из этой переменной...
 
интересно понимать, какие ресурсы занимаются операционной системой при создании очередного хэндла, выделяется только ОП или что-то ещё забираетсяв системе, что потом нужно отдать?  или можно не отдавать?
 
 
 
 
 
Добавлено:
вот интересно, ЧТО произойдёт, если замутить такой цикл:
 
  for i:=1 to 1000000 do begin
    FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
    // закрывать FileHandle не будем
    end;
 
насколько весомо это сожрёт ресурсы ОС?

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 21:28 16-10-2006
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
в JEDI в модуле JclFileUtils
есть функция  

Код:
 
function SetFileLastAccess(const FileName: string; const DateTime: TDateTime): Boolean;
begin
  Result := SetFileTimesHelper(FileName, DateTime, ftLastAccess);
end;
 

 
Подробнее...

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 23:31 16-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
Все будет понятно если прочесть книгу Соломона анд Русиновича Внутренее устройство Windows где как раз и говорится об этом в одном из разделов приводится пример по созданию максимального количества открытых описателей, ответ гдето около 16 милионов.
Структура описателя состоит из двух 32 битных елементов.
Насчет CloseHandle() то эта процедура никак не относится только к хендлам окна.
 
Добавлено:
rs
Вот тебе процедура меняющая только дату последнего доступа проверено рабочая (по крайней мере у меня).
Проблема скорее в том что кроме флага доступа есть еще и флаги на чтение атрибутов.
Подробнее...

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 00:02 17-10-2006 | Исправлено: RedPromo, 01:56 17-10-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs

Цитата:
может можно иметь одну переменную FileHandle, открывая в неё в цикле хэндл файла и не делать освобождения из этой переменной...

Я тоже так раньше думал ) Попробуй сделать оунердро приложение и в событии WM_Paint постоянно создавай контекст устройства (DC) и рисуй на нем, но не освобождай, когда будешь рисовать на нем аналогично не освобождай кисти, фонты и прочее, запусти проект и повози окно минуты 3-4 по экрану, либо просто запусти его и пусть оно поработает полчасика (я думаю хватит) при этом ты продолжай работать на компе, увидишь очень интересный эффект (при отладке значение контекста устройства становится отрицательным с очень большой величиной) - весь экран затянет черным цветом, приложение будет отрисовывать где угодно, только не на себе.  


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:20 17-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
поясни, что ты имеешь в виду:

ты же писал

Цитата:
какой-нибудь FreeHandle вместо FileClose

вот я тебе и написал CloseHandle(Handle)
закрывашь хэндл в конце цикла

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 07:55 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SERGE_BLIZNUK
RedPromo
да, эти примеры "работают" точно так же - если смотреть установленную дату доступа до закрытия хендла файла - видим ту дату, что установили файлу в дельфийской программе, но после закрытия хэндла файл приобретает дату доступа на момент закрытия хендла...
 
замкнутый круг...
 
или это проблемы дельфийской организации с win-api методами?
 
 
 
 
Добавлено:
ShIvADeSt
да я тоже примерно так и думаю...
 
только что делать-то?...
 
Добавлено:
даже если хэндл не закрывать явно, то после закрытия программы все незакрытые хэндлы освобождает система исполнения дельфи и файл всё равно приобретает дату доступа равной дате закрытия программы
 
Добавлено:
DroN_S
так похоже не пойдёт

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 08:54 17-10-2006
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вот я тебе и написал CloseHandle(Handle)  
закрывашь хэндл в конце цикла

Не поможет. Ибо CloseFile сама работает через CloseHandle.

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:05 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
может быть тогда это действие можно "завернуть" в dll, написанную не на дельфи, если предположить, что это кривизна дельфийской организации работы с файлами через win api? и вызвать потом эту dll из дельфийской программы

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 09:23 17-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
rs

Цитата:
если предположить, что это кривизна дельфийской организации работы с файлами через win api? и вызвать потом эту dll из дельфийской программы

Делфи тут совершенно ни при чем, просто так работает ОС. В работе с винапи у делфи вообще кривизны нет (это чистая компиляция), кривизна появляется уже в VCL-надстройке, но это уже "совсем другая история"
А вообще основывать какую-то логику на времени последнего доступа - не самая хорошая идея. Слишком много причин по которым оно может поменяться (антивирус файл проверит - и все)

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 09:51 17-10-2006 | Исправлено: RomanTim, 09:54 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim

Цитата:
Какая разница откуда работать с винапи - делфи тут совершенно ни при чем
ну как бы известно, что разные среды исполнения могут по разном "заворачивать" win api методы
 

Цитата:
Вообще основывать какую-то логику на времени последнего доступа - не самая хорошая идея - слишком много причин по которым оно может поменяться (антивирус файл проверит - и вс
если такая дата у файла есть, значит она рассчитана на использование
 
во многих антивирусах есть настройки сохранения этой даты
 
эта возможность нужна для чистки файлов, к которым давно не обращзались через HandyCache

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 09:54 17-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
Вобще этот пример у мена нормально работает с обязяательным закрытием хендла.
Тоесть дата меняется только одна дата открытия и все.
Проверял на 2 компьютерах.
Никакой кривизны работы нету с файлами Delphi.
Кстати мой пример вызывает вполне API шные функции Kernel32.dll.
Если хочеш опустится ниже тогдо только функции NtDll.dll даже NtSetInformationFile;
Если и этого мало тогда только драйвер уровня ядра.
И напрямую, тут уж тебе помешать врядли кто сможет.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 10:45 17-10-2006 | Исправлено: RedPromo, 10:51 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo

Цитата:
Вобще этот пример у мена нормально работает с обязяательным закрытием хендла.

у меня delph 7, у тебя на какой версии?
 
поможешь разобраться, почему у меня не работает как надо? - cможешь прислать следующее?
  - полный проект с исходниками
  - готовый exe
 
связаться можно через ПМ
tnx
 

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 10:55 17-10-2006 | Исправлено: rs, 11:01 17-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
Могу, у меня BDS2006.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 11:04 17-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
RedPromo

Цитата:
Вобще этот пример у мена нормально работает с обязяательным закрытием хендла.
Тоесть дата меняется только одна дата открытия и все.

Дело не в том, чтобы установить только время последнего доступа, дело в том, что при CloseHandle система его принудительно устанавливает в текущее (в твоем примере ты это делаешь сам - так что оно потом не меняется)
Возможно это действительно можно сделать через более низкоуровневые функции - надо пробовать.
Кстати, в .Net функция SetLastAccessTime тоже меняет время только на время пока файл не освободится
 
 
Добавлено:
Все оказывается не совсем так...
У меня время меняется и остается установленным:

Код:
  h := CreateFile(PChar(Edit1.Text), FILE_WRITE_ATTRIBUTES, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
SetFileTime(...)

Вот только если вызвать свойства файла из проводника, то оно сбивается на текущее - но вполне возможно, что это антивирус такое делает, а отключить не могу, ибо корпоративная безопасность не пущает

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 11:17 17-10-2006 | Исправлено: RomanTim, 11:56 17-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Уже согласно просьбе rs изменил времмя всеравно работает тоесть устанавливает требуемое времмя.
вот текст
Подробнее...

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 11:54 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
спсибо за пример - запустил построенный тобой exe вот так:
  Project1.exe Project1.dpr
 
файл Project1.dpr НЕ изменл дату доступа на    
    st.wYear:= 1999;
    st.wMonth:= 5;
    st.wDay:= 10;
 
а у тебя?
 
 
 
Добавлено:
RedPromo
слушай, а у тебя  в винде стоит флаг реестра ОтслеживатьДатуДоступа к файлу?
 
Добавлено:
д.б. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate = 0

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 11:57 17-10-2006 | Исправлено: rs, 12:07 17-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
Вот вот, этот то момент я и забыл сказать конечно отключен.
В этом то и проблема, ну а решение ее наверно нет потому как установкой даты последнего доступа занимается то подсистема на уровне ядра скорее всего и временно ее отключать былобы конечно очень даже не плохо.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 12:04 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
так получается win api метод, лишённый смысла... странно как-то это
 
да и есть программы, которые могут это делать...
 
Добавлено:
RomanTim

Цитата:
Все оказывается не совсем так...  
У меня время меняется и остается установленным:
так давай подробнее - ты хочешь сказать, что после отработки твоей программы и её закрытия файл имеет дату доступа ту, которую ТЫ установил в программе, а НЕ дату закрытия файла в программме?
 
если да - дашь полный проект и exe?

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 12:08 17-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
Значит вперед изучать функции ntdll.dll. Да и назови програму такую, можна же посмотреть какие она юзает функции.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 12:14 17-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedPromo
говорят drweb

 
кстати, где-то встерчал (не помню где) что метод работаетт ин а fat - не очень хотелось бы к ntfs привязыватиься

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 12:26 17-10-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru