Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизКак ускорить работу с винчестером? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c