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

Вниз

Как ускорить работу с винчестером?   Найти похожие ветки 

 
Tahion ©   (2002-06-06 19:50) [0]

Моя прогамма при создании главной формы на основе определенных данных создает/измен. существующие значения в/ INI-файл(-е) (1). После этого созданный файл остается открытым, и его содержимое копируется в др. INI-файл (2), который также остается открытым на протяжении всей работы программы (Free не вызываю).
СРАЗУ за этим начинается интенсивное считываниес обоих файлов, причем в 2 еще и ,время от времени, запись. Естественно, что при этом я уже не проверяю наличия файлов на винчестере (я их только-что создал).

И вот вопросы:
1. почему файл 1 создается не свегда, если его нет до этого на винчестере?
2. почему, если файл 1 уже там есть, не все данные в нем переписываются?
3. почему иногда создается файл 1, но не создается файл 2?

Я вижу причину в разной скорости работы винчестера и процессора (ошибка в коде вряд ли - никаких уловий на создания я не накладавал).

Соответственно еще вопросы:
4. Как дождаться создания файла 1 до копирования его содержимого в файл 2, и дождаться создания файла 2 до начала считывания из них (1,2)?
5. Почему бывает так, что файл не создается вообще? Ведь если причина в разности скоростей, то файл ДОЛЖЕН создаваться, хоть и с опозданием!

Ну и последнее: ЧТО ТУТ МОЖНО ЗДЕЛАТЬ?

Выскажте, please, хоть какие-нибудь соображения по этому поводу.
Заранее спасибо за ответы!


 
Shaman_Naydak ©   (2002-06-06 20:17) [1]

Нет, парень, причина в ДНК, я так думаю.
Разная скорость винта и проца точно тут не при чем


 
Tahion ©   (2002-06-06 20:21) [2]

В коде что-ли?


 
QymL   (2002-06-06 20:24) [3]

Попробуй вызывать функцию Flush (я нее помню как точно, посмотри в докуметации) для записи буферов файла на диск.


 
Tahion ©   (2002-06-06 20:33) [4]

Вот часть кода:

procedure TMainForm.FormCreate(Sender: TObject);
var
s: string;
FileName: string;

begin//
...
CurIni:=TIniFile.Create(PrDir+"Имя1.ini");
FileName:=.........//опредпараметр в реестре через TRegINIFile.ReadString(...);
CurIni.WriteString("FileNames", "Имя", FileName);
CopyFile(PChar(PrDir+"Имя1.ini"), PChar(PrDir+"Имя2.ini"));
Ini:=TIniFile.Create(PrDir+"Имя2.ini");
...
//А здесь ф-ция, которая производит чтени уже с Ini
...
end
;

Все, что не задано в ВАР-е, но есть здесь, явл. глобальными переменными!!!


 
Shaman_Naydak ©   (2002-06-06 20:49) [5]

Перед копированием файла
поставь
CurIni.UpdateFile;
Если не поможет придется таки закрывать 1-ый Ini-шник перед копированием.
А зачем так заморачиваться-то?




 
Tahion ©   (2002-06-08 14:21) [6]

Попробуем....
--А зачем так заморачиваться-то?
Если не так, то тогда, все параметры руками переписывать надо, а файлов обязательно два быть должно.

Спасибо!


 
Tahion ©   (2002-06-09 16:48) [7]

УТОЧНЕНИЕ:
Прверял как создает файлы мой вариант и получил интересную закономерность - файлы создаются РОВНО ЧЕРЕЗ РАЗ, и, соответственно, если уже 1,2 существуют, то изменения в них тоже заносит РОВНО ЧЕРЕЗ РАЗ. (Проверял так: откомпилировал программу, удалил оба инишника, открыл, закрыл. Если создала ини, то удалил их. Опять отрыл, и т.д.)

CurIni.UpdateFile; не помогло.
Пробовал освобождать CurIni перед закрытием - еще хуже:
1 создает РОВНО ЧЕРЕЗ РАЗ, а второй создает тогда, когда и первый, но пишет туда разную "бяку". Вот несколько вариантов:
Первый:
-Х~еУЪ+юt9hЬ_J ЪuТh¶¦J _+XЪЪЪ- Ху¦УЪ__XЪЪЪ¦¦X+H Х?.ЖЪХз+УЪИ: h ¦J h,¦J _E-P
Второй:
tyle ф‹A fsBoldfsItalicfsUnderlinefsStrikeOutЌ@ @ЊA TFontStylesф‹A
Третий:
t;
\par st2:=copy(term,\plain\f0\fs16\cf4 1\plain\f0\fs16 ,pos-\plain\f0\fs16\c
и т.д. - полный бред!!!

>>QymL (06.06.02 20:24)
>>Попробуй вызывать функцию Flush (я нее помню как точно, посмотри в >>докуметации) для записи буферов файла на диск.
Flush - не разобрался, а в справке не нашел (Д4). Есть там один Flush, но он связан с I/O errors и не имеет никакого отношения к ИНИ- файлам (или я чего-то не понял).

P.S. Вместо CopyFile сделал свою процедуру, которая открывает 1 инишник, поочередно счатуеут нужные мне данные, и сразу записывает их в 2 ини. Работает всегда ТОЛЬКО ЕСЛИ СТАВЛЮ ЕЕ В ФОРМ.ЭКТИВЭЙТ, но медленее. Что не так с CopyFile? Почему только Форм.эктивэйт?





 
BOOT CrAsH   (2002-06-09 16:57) [8]

Ух уж не люблю я эти компоненты типа TIniFile. Мой тебе совет: реализуй все это руками на низком уровне, используй обычные BlockRead и BlockWrite, можно еще FileRead и FileWrite.
Поверь, будет пахать как трактор :)))) Но придется повозиться с кодом.


 
Tahion ©   (2002-06-12 15:26) [9]

Ох впадло так долго мучаться...


 
allrussia ©   (2002-06-13 03:45) [10]

(fileexists )напиши цикл пока первый файл не создастся физически на диске не будет создаваться второй, и т.д., не начнется запись в файл и т.п., не запустится главное окно

вообще у меня похожая байда лечилась

WritePrivateProfileString(nil,nil,nil,имя ini-файла) для 9x

WritePrivateProfileStringW(nil,nil,nil,имя ini-файла) для NT



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

Текущий архив: 2002.06.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
14-77561
IronHawk
2002-04-29 16:07
2002.06.24
---|Ветка была без названия|---


1-77430
Vladimir Prokofiev
2002-06-11 11:46
2002.06.24
Про создание AVI-файлов прямо из Delphi


1-77407
Oleg+++
2002-06-10 22:18
2002.06.24
Как правильно использовать функцию SetSystemTime?


14-77606
copyr25
2002-05-18 21:28
2002.06.24
---|Ветка была без названия|---


1-77417
Charlz
2002-06-11 01:25
2002.06.24
Сложение чисел