Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];

Вниз

Использование SetFilePointerEx.   Найти похожие ветки 

 
Riply ©   (2007-07-01 01:27) [0]

Здравствуйте !
Подскажите, пожалуйста, как лучше поступить в такой ситуации:
Допустим нам надо установить "файловый поинтер" в новое значение - NewPointer.
NewPointer - ну очень болшое число :). Мы знаем, что в настоящее время,
"файловый поинтер" совсем рядом с NewPointer.
Какой из вариантов:
1. if SetFilePointerEx(Handle, 0, @OldPointer, FILE_CURRENT) then
   SetFilePointerEx(Handle, NewPointer - OldPointer, nil, FILE_CURRENT);
2. SetFilePointerEx(Handle, NewPointer, nil, FILE_BEGIN);
лучше выбрать ?
P.S.
Просто я не знаю, как "внутри себя" работает SetFilePointerEx :(


 
KilkennyCat ©   (2007-07-01 03:29) [1]

Без разницы, наверное. Непонятно только, зачем проверка в 1.


 
begin...end ©   (2007-07-01 09:11) [2]

Лучше выбрать второй вариант.


 
Riply ©   (2007-07-01 10:36) [3]

> [1] KilkennyCat ©   (01.07.07 03:29)
>Без разницы, наверное. Непонятно только, зачем проверка в 1.
Там не проверка, а получение поинтера :)

>[2] begin...end ©   (01.07.07 09:11)
>Лучше выбрать второй вариант.
Спасибо.
А можно мотивировать это утверждение ?
Или оно "интуитивно ясно из общих соображений"(с) ? :)


 
begin...end ©   (2007-07-01 12:29) [4]

> Riply ©   (01.07.07 10:36) [3]

Близость требуемой позиции файлового указателя к его текущей позиции на этапе исполнения SetFilePointerEx не имеет значения. Перемещение  указателя этой функцией сводится к вызову внутренней функции NtSetInformationFile, в которую должна передаваться требуемая абсолютная позиция указателя (смещение от начала файла).

С помощью отладчика легко убедиться, что в случае вызова SetFilePointerEx c флагом FILE_CURRENT внутри неё вначале будет вызвана NtQueryInformationFile, для определения текущего положения указателя и последующего вычисления абсолютного смещения. Если же использовать флаг FILE_BEGIN, вызова NtQueryInformationFile не потребуется.

Отсюда ясно, что первый вариант не только не принесёт никакого выигрыша в производительности, но даже и окажется медленнее второго варианта, из-за а) двойного вызова SetFilePointerEx; б) исполнения внутренних вызовов этой функции, ненужных в случае флага FILE_BEGIN.


 
Riply ©   (2007-07-01 12:51) [5]

> [4] begin...end ©   (01.07.07 12:29)
Спасибо большое !



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.048 c
15-1183290441
Kolan
2007-07-01 15:47
2007.07.29
Help&Manual Toggles всегда открыты, как исправить?


2-1183383561
авыф
2007-07-02 17:39
2007.07.29
MS SQL 2005


2-1183367944
RomanH
2007-07-02 13:19
2007.07.29
MySQL


2-1183623056
Vasyl
2007-07-05 12:10
2007.07.29
RxLookupEdit1


1-1179903800
parasolka
2007-05-23 11:03
2007.07.29
Проиграть видео из Dll.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский